🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

3 total messages Started by Lawrence Giltner Sun, 08 Nov 1992 11:35
Procedure to matchup (){}[] ???
#70
Author: Lawrence Giltner
Date: Sun, 08 Nov 1992 11:35
16 lines
1175 bytes
Before I spend a lot of time reinventing the wheel:

Does anybody have a procedure to pair up parenthesis, brackets, and
braces.  I would like to put the cursor on one of ()[]{} and let the
program figure out which direction it has to search and if found, then
marks/selects all the text between them, including the ()[]{}.

Is there a TPU procedure for this?   TPU v2.6 on VMS v5.5.

I wrote a procedure like this for VDE and would like the same
convenience.

   main.frame (man'fram'), n. the largest peripheral you can attach to a PC.
   Of course these are my opinions, you'll have to go out and buy your own!
 VAX Internet  ldgiltne@wsuhub.uc.twsu.edu   VAX BITNET  ldgiltne at twsuvax
                Wichita State University   Wichita, Kansas,  U.S.A.
MATCHD.1-of-1 (Re: Procedure to matchup (){}[] ???)
#72
Author: fairfield
Date: Sun, 08 Nov 1992 23:21
326 lines
12523 bytes
In article <1992Nov8.053543.383@wsuhub.uc.twsu.edu>, ldgiltne@wsuhub.uc.twsu.edu (Lawrence Giltner) writes:
> Before I spend a lot of time reinventing the wheel:
> 
> Does anybody have a procedure to pair up parenthesis, brackets, and
> braces.  I would like to put the cursor on one of ()[]{} and let the
> program figure out which direction it has to search and if found, then
> marks/selects all the text between them, including the ()[]{}.
> 
> Is there a TPU procedure for this?   TPU v2.6 on VMS v5.5.

    Below I've included a VMS_SHARE file containing TPU code to do just
what you want.  In addition to matching (), [], and {}, it matches <>,
`', Ascii(171) with  Ascii(187) [the left an right angle-quotation marks],
and Asccii(191) with ? [the upside-down with the rightside-up quesion marks].
It also matches double quotes with each other, but that's pretty much useless
as they have no "parity"...

    The TPU file is in a form suitable to be include in an EVE$BUILD master 
list, i.e., with MODULE_IDENT and MODULE_INIT routines.  If you just want to
EXTEND TPU * and save the sectionfile, you'll need to move the definition
of khf$kt_left_delims and khf$kt_right_delims to your init file, or into
the main procedure, EVE_MATCH_DELIMITORS, defining them each time through the
routine...

    To use, just put the cursor on one member of the delimitors you want to 
match, then hit DO and type "MATCH" on the EVE command line (or define a key 
to do MATCH DELIMITORS and press that key).

		Cheers, Ken
-- 
 Dr. Kenneth H. Fairfield    |  Internet: Fairfield@Slac.Stanford.Edu
 SLAC, P.O.Box 4349, MS 98   |  DECnet:   45537::FAIRFIELD (45537=SLACVX)
 Stanford, CA   94309        |  BITNET    Fairfield@Slacvx
 ----------------------------------------------------------------------------
 These opinions are mine, not SLAC's, Stanford's, nor the DOE's...

$! ------------------ CUT HERE -----------------------
$ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))'
$!
$! This archive created by VMS_SHARE Version 8.1
$!   On  8-NOV-1992 15:08:14.25   By user FAIRFIELD   
$!
$! The VMS_SHARE software that created this archive
$!    was written by  Andy Harper, Kings College London UK
$!    -- September 1992
$!
$! Credit is due to these people for their original ideas:
$!    James Gray, Michael Bednarek 
$!
$! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER
$! AND EXECUTE AS A COMMAND PROCEDURE  (  @name  )
$!
$! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING:
$!       1. MATCHDELIM.TPU;2
$!
$set="set"
$set symbol/scope=(nolocal,noglobal)
$f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID"))
$e="write sys$error  ""%UNPACK"", "
$w="write sys$output ""%UNPACK"", "
$ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!"
$ ve=f$getsyi("version")
$ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start
$ e "-E-OLDVER, Must run at least VMS 4.4"
$ v=f$verify(v)
$ exit 44
$unpack: subroutine ! P1=filename, P2=checksum, P3=attributes
$ if f$search(P1) .eqs. "" then $ goto file_absent
$ e "-W-EXISTS, File ''P1' exists. Skipped."
$ delete 'f'*
$ exit
$file_absent:
$ if f$parse(P1) .nes. "" then $ goto dirok
$ dn=f$parse(P1,,,"DIRECTORY")
$ w "-I-CREDIR, Creating directory ''dn'"
$ create/dir 'dn'
$ if $status then $ goto dirok
$ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped."
$ delete 'f'*
$ exit
$dirok:
$ w "-I-UNPACK, Unpacking file ''P1'"
$ n=P1
$ if P3 .nes. "" then $ n=f
$ if .not. f$verify() then $ define/user sys$output nl:
$ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='n'
PROCEDURE GetHex LOCAL x1,x2;x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,
ERASE_CHARACTER(1))-1;RETURN 16*x1+x2;ENDPROCEDURE;
PROCEDURE SkipPartsep LOOP EXITIF INDEX(ERASE_LINE,"-+-+-+-+-+-+-+-+")=1;
ENDLOOP;ENDPROCEDURE;
PROCEDURE ExpandChar CASE CURRENT_CHARACTER FROM ' ' TO 'z' ["`"]
:ERASE_CHARACTER(1);COPY_TEXT(ASCII(GetHex));[" "]:ERASE_CHARACTER(1);[
OUTRANGE,INRANGE]:MOVE_HORIZONTAL(1);ENDCASE;ENDPROCEDURE;
PROCEDURE ProcessLine s:=ERASE_CHARACTER(1);LOOP EXITIF CURRENT_OFFSET>=LENGTH(
CURRENT_LINE);ExpandChar;ENDLOOP;IF s="V" THEN APPEND_LINE;ENDIF;ENDPROCEDURE;
PROCEDURE AdvanceLine MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);
ENDPROCEDURE;PROCEDURE Decode POSITION(BEGINNING_OF(b));LOOP EXITIF MARK(NONE)=
END_OF(b);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")=1 THEN SkipPartSep;
ELSE ProcessLine;AdvanceLine;ENDIF;ENDLOOP;ENDPROCEDURE;SET(FACILITY_NAME,
"UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL,OFF);t:="0123456789ABCDEF";f:=
GET_INFO(COMMAND_LINE,"file_name");b:=CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,
GET_INFO(COMMAND_LINE,"output_file"));QUIT;
$ if p3 .eqs. "" then $ goto dl
$ open/write fdl &f
$ write fdl "RECORD"
$ write fdl P3
$ close fdl
$ w "-I-CONVRFM, Converting record format to ", P3
$ convert/fdl=&f &f-1 &P1
$dl: delete 'f'*
$ if P2 .eqs. "" then $ goto ckskip
$ checksum 'P1'
$ if checksum$checksum .nes. P2 then $ -
  e "-E-CHKSMFAIL, Checksum of ''P1' failed."
$ exit
$ckskip: e "-W-CHKSUMSKIP, checksum validation unavailable for ''P1'"
$ endsubroutine
$start:
$!
$ create 'f'
Xprocedure`20KHF_MATCHD_MODULE_IDENT
X`09return`20"V02-001";
Xendprocedure;
X
X
Xprocedure`20KHF_MATCHD_MODULE_INIT
X
X!+
X!`20`20Initialize`20marker`20variables`20used`20by`20Eve_Match_Delimitors:
X!-
X`20`20khf$x_match1_position:=`200;
X`20`20khf$x_match2_position:=`200;
X`20`20khf$x_match3_position:=`200;
X`20`20khf$x_match4_position:=`200;
X
X!+
X!`20`20Initialize`20list`20of`20delimitors`20used`20by`20Eve_Match_Delimitors.
V`20`20Include
X!`20`20double-angle`20quotes`20and`20upside-down`20question`20mark`20in`20deli
Vmitor`20list;
X!`20`20a`20generic`20double-quote`20mark`20matches`20itself.`20`20A`20user`20m
Vay`20modify`20these
X!`20`20strings`20in`20a`20TPU$COMMAND`20procedure.
X!-
X`20`20khf$kt_left_delims`20`20:=`20Ascii(34)`20+`20"(<`5B`60`7B"`20+`20Ascii(1
V71)`20+`20Ascii(191);
X`20`20khf$kt_right_delims`20:=`20Ascii(34)`20+`20")>`5D'`7D"`20+`20Ascii(187)
V`20+`20"?";
X
Xendprocedure;
X
X
X!++
X!`20`20`20This`20procedure`20highlights`20(in`20BOLD,`20REVERSE`20video)`20mat
Vching`20pairs
X!`20`20`20of`20delimitors,`20the`20first`20of`20which`20is`20taken`20to`20be
V`20the`20character`20at
X!`20`20`20the`20current`20cursor`20position.`20`20Highlighting`20is`20turned
V`20off`20by`20invoking
X!`20`20`20this`20procedure`20with`20the`20cursor`20positioned`20on`20a`20non-d
Velimitor`20character.
X!`20`20`20Subsequent`20invocations`20turn`20off`20the`20highlighting`20on`20pr
Veviously`20matched
X!`20`20`20pairs,`20as`20well.
X!
X!`20`20`20This`20procedure`20uses`20the`20global`20marker`20variables`20khf$x_
Vmatch1_position,
X!`20`20`20khf$x_match2_position,`20khf$x_match3_position,`20and`20khf$x_match4
V_position.
X!
X!`20Author/Date:`09`09K.H.`20Fairfield,`09`0916-Jan-1988
X!
X!--
XProcedure`20Eve_Match_Delimitors
X!`09`20`20--------------------
XLocal`20saved_mark,`09!`20mark`20current`20position
X`20`20`20`20`20`20first_char,`09!`20first`20character`20of`20matching`20pair
X`20`20`20`20`20`20last_char,`09!`20second`20character`20of`20matching`20pair
X`20`20`20`20`20`20direction,`09!`20search`20direction
X`20`20`20`20`20`20n;`09`09!`20character`20position`20in`20khf$kt_left_delims
V`20or
X`09`09`09!`20khf$kt_right_delims`20string.
X
X
X`20`20`20`20On_Error
X`09`5BTPU$_CONTROLC`5D:
X`09`20`20`20`20Eve$Learn_Abort;
X`09`20`20`20`20Eve$$Restore_Position`20(saved_mark);
X`09`5BOTHERWISE`5D:
X`09`20`20`20`20Eve$$Restore_Position`20(saved_mark);
X`20`20`20`20Endon_Error;
X
X
X`20`20`20`20saved_mark`20:=`20Mark`20(NONE);
X
X!+
X!`20`20Make`20an`20early`20return`20here`20if`20the`20current`20position`20is
V`20the`20same
X!`20`20position`20as`20the`20last`20previously`20marked`20delimitor.
X!-
X`20`20`20`20If`20khf$x_match1_position`20<>`200`20Then
X`09If`20saved_mark`20=`20khf$x_match1_position`20Then
X
X`09`20`20`20`20khf$x_match1_position:=`200;
X`09`20`20`20`20khf$x_match2_position:=`200;
X`09`20`20`20`20khf$x_match3_position:=`200;
X`09`20`20`20`20khf$x_match4_position:=`200;
X`09`20`20`20`20Return`20(TRUE);
X
X`09Endif;
X`20`20`20`20Endif;
X
X`20`20`20`20first_char`20:=`20CURRENT_CHARACTER;
X
X`20`20`20`20n`20:=`20Index`20(khf$kt_left_delims,`20first_char);
X
X`20`20`20`20If`20n`20>`200`20Then
X`09last_char`20:=`20Substr`20(khf$kt_right_delims,`20n,`201);
X`09direction`20:=`20FORWARD;
X`20`20`20`20Else
X`09n`20:=`20Index`20(khf$kt_right_delims,`20first_char);
X
X`09If`20n`20>`200`20Then
X`09`20`20`20`20last_char`20:=`20Substr`20(khf$kt_left_delims,`20n,`201);
X`09`20`20`20`20direction`20:=`20REVERSE;
X`09Else
X!+
X!`20`20Current_Character`20was`20not`20a`20delimitor.`20`20If`20highlighting
V`20is`20on,`20turn`20it
X!`20`20off,`20else`20issue`20an`20error`20message.
X!-
X`09`20`20`20`20If`20khf$x_match1_position`20=`200`20Then
X`09`09Eve$message`20("The`20current`20character,`20"`20+`20first_char`20+
X`09`09`09`20",`20is`20not`20a`20valid`20delimitor`20to`20match.");
X`09`20`20`20`20Endif;
X`09`20`20`20`20khf$x_match1_position:=`200;
X`09`20`20`20`20khf$x_match2_position:=`200;
X`09`20`20`20`20khf$x_match3_position:=`200;
X`09`20`20`20`20khf$x_match4_position:=`200;
X`09`20`20`20`20Return`20(FALSE);
X`09Endif;
X`20`20`20`20Endif;
X
X`20`20`20`20khf$x_match1_position:=`20Mark`20(BOLD);
X`20`20`20`20khf$x_match2_position:=`20Mark`20(REVERSE);
X
X`20`20`20`20If`20Khf_Find_Match`20(first_char,`20last_char,`20direction)`20=
V`201`20Then
X`09khf$x_match3_position:=`20Mark`20(BOLD);
X`09khf$x_match4_position:=`20Mark`20(REVERSE);
X`09Update`20(CURRENT_WINDOW);
X`09Position`20(khf$x_match1_position);
X`09Return`20(TRUE);
X`20`20`20`20Else
X`09Position`20(khf$x_match1_position);
X`09khf$x_match1_position:=`200;
X`09khf$x_match2_position:=`200;
X`09khf$x_match3_position:=`200;
X`09khf$x_match4_position:=`200;
X`09Eve$message`20("`20Could`20not`20find`20the`20matching`20"`20+`20last_char
V`20+
X`09`09`20"`20character`20for`20the`20current`20character,`20"`20+`20first_char
V);
X`09Return`20(FALSE);
X`20`20`20`20Endif;
X
X
XEndProcedure;`09`09!`20Eve_Match_Delimitors
X
X
X!++
X!`20`20`20The`20following`20procedure`20does`20the`20actually`20search`20for
V`20the`20matching
X!`20`20`20delimitor`20character.`20`20A`20recursive`20algorithm`20is`20used
V`20so`20that`20intervening
X!`20`20`20pairs`20of`20matched`20delimitors`20are`20not`20mistakenly`20selecte
Vd`20as`20the`20match.
X!
X!`20Input`20Parameters:
X!
X!`09first`09`20`20`20`20the`20delimitor`20character`20whose`20mate`20is`20bein
Vg`20sought
X!
X!`09last`09`20`20`20`20the`20matching`20delimitor`20character
X!
X!`09direction`20`20`20the`20direction`20to`20search.`20`20If`20first_char`20is
V`20a`20right-
X!`09`09`20`20`20`20delimitor,`20the`20search`20direction`20is`20FORWARD,
X!`09`09`20`20`20`20otherwise`20it`20is`20REVERSE.
X!
X!`20Author/Date:`09`09K.H.`20Fairfield,`09`0916-Jan-1988
X!-
X
XProcedure`20Khf_Find_Match`20(first,`20last,`20direction)
X!`09`20`20--------------
XLocal`20this_patt,`20this_range;
X
X`20`20`20`20this_patt`20:=`20first`20+`20last;
X`20`20`20`20Loop
X`09If`20direction`20=`20FORWARD`20Then
X`09`20`20`20`20Move_Horizontal`20(1);
X`09Else
X`09`20`20`20`20Move_Horizontal`20(-1);
X`09Endif;
X`09this_range`20:=`20Search_Quietly`20(Any`20(this_patt),`20direction);
X`09If`20this_range`20<>`200
X`09Then
X`09`20`20`20`20Position`20(this_range);
X`09Else
X`09`20`20`20`20Return`20(0);
X`09Endif;
X`09If`20CURRENT_CHARACTER`20=`20last`20Then
X`09`20`20`20`20Return`20(1);
X`09Else
X`09`20`20`20`20If`20Khf_Find_Match`20(first,`20last,`20direction)`20=`200`20Th
Ven
X`09`09Return`20(0);
X`09`20`20`20`20Endif;
X`09Endif;
X`20`20`20`20Endloop;
X
XEndprocedure;`09`09!`20Khf_Find_Match
X
$ call unpack MATCHDELIM.TPU;2 1952715885 ""
$ v=f$verify(v)
$ exit
Re: Procedure to matchup (){}[] ???
#77
Author: ht
Date: Wed, 11 Nov 1992 07:58
76 lines
2439 bytes
In article <1992Nov8.053543.383@wsuhub.uc.twsu.edu>, ldgiltne@wsuhub.uc.twsu.edu (Lawrence Giltner) writes:
> Before I spend a lot of time reinventing the wheel:
> 
> Does anybody have a procedure to pair up parenthesis, brackets, and
> braces.  I would like to put the cursor on one of ()[]{} and let the
> program figure out which direction it has to search and if found, then
> marks/selects all the text between them, including the ()[]{}.
I have one that finds the corresponding paren, brac. or whatever, but it does
not select the text between - mind you that is easy: just press select
before you find the matching thingymagig.

---------
procedure find_bracket
local
  cur_ch,
  this_ch,
  br_list,
  br_num,
  pat,
  level,
  here,
  there,
  direction;

  cur_ch := get_info(get_info(BUFFER, 'current'), 'character');
  br_list := "()[]{}<>+;!!??";
  br_num := INDEX(br_list, cur_ch);

  if br_num = 0
  then
    MESSAGE ("Not on a bracket");
  else
    br_num := ((br_num+1)/2)*2 -1;
    if br_num = INDEX(br_list, cur_ch)
    then
      direction:= FORWARD;
    else
      direction:= REVERSE;
    endif;

    pat := ANY(SUBSTR(br_list, br_num, 2));
    level := 1;
    here := mark(NONE);

    loop
      if direction = FORWARD
      then
        move_horizontal(1);
      else
        move_horizontal(-1);
      endif;
      there := search_quietly(pat, direction);
      exitif there = 0;      
      position(there);
      this_ch := get_info(get_info(BUFFER, 'current'), 'character');
      if this_ch = cur_ch
      then
          level := level + 1;
      else
          level := level - 1;
      endif;                               
      exitif level = 0;
    endloop;
    if there = 0 then
      position(here);
      message ("Matching bracket not found");
    endif;
  endif;
endprocedure

---
compile it and bind it to a key of your choice.
---
Henrik Tougaard             Postmaster, News-Reader and general dogsbody
Datani A/S, Software Consultants
Copenhagen, Denmark         Only my own opinions........
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads