home *** CD-ROM | disk | FTP | other *** search
- Path: sparky!uunet!zaphod.mps.ohio-state.edu!moe.ksu.ksu.edu!mccall!info-tpu-newsgate!list
- Newsgroups: vmsnet.tpu
- Subject: RE: Procedure to matchup (){}[] ???
- Message-ID: <009635A2.BF79C100.26937@SHSU.edu>
- From: "George D. Greenwade" <bed_gdg@shsu.edu>
- Date: Mon, 09 Nov 1992 10:32:39 CST
- Reply-To: "George D. Greenwade" <bed_gdg@SHSU.edu>
- Organization: The Internet
- Return-Path: <TPU-Mgr@SHSU.edu>
- Errors-To: TPU-Mgr@SHSU.edu
- X-Listname: Text Processing Utility (TPU) Language Discussion List
- CC: info-tpu@SHSU.edu
- Lines: 129
-
- On 8 Nov 92 05:35:43 CST, ldgiltne@wsuhub.uc.twsu.edu (Lawrence Giltner)
- asked:
- > 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.
-
- Taken shamelessly from my EFE code, I attach efe$find_match and
- efe$find_matching. This set of two procedures allows you to place the
- cursor on the opening delimiter, (, [, {, or <, and find the matching
- closing delimiter. This function is defined as Gold/X in EFE. While I
- haven't coded it in, it should be relatively trivial to do a backward
- search, starting on the closing delimiter to find the opening delimiter
- (copy efe$find_matching to something such as efe$find_matching_reverse,
- change the search from forward to reverse in the copied procedure, add a
- few extra if/endif statements near the start of efe$find_match pointing to
- to efe$find_matching_reverse if the delimiter is a closer, etc.).
-
- If you rename efe$find_match to something such as eve_match_delimiter, you
- should be able to place the cursor on the opening delimiter, then use
- DO/MATCH DELIMITER.
-
- Regards, George
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- George D. Greenwade, Ph.D. Bitnet: BED_GDG@SHSU
- Department of Economics and Business Analysis THEnet: SHSU::BED_GDG
- College of Business Administration Voice: (409) 294-1266
- P. O. Box 2118 FAX: (409) 294-3612
- Sam Houston State University Internet: bed_gdg@SHSU.edu
- Huntsville, TX 77341 bed_gdg%SHSU.decnet@relay.the.net
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- procedure efe$find_match ! Find matching enclosures
- local the_char, ! Character we want to match
- original_position, ! Where we presently are (mark)
- original_character, ! What we are trying to match
- find_character, ! Character we are searching for
- found_target, ! Where we are going (mark)
- response; ! Check to go to first mark
- original_position := mark(reverse);
- original_character := current_character;
- if original_character = "(" then find_character := ")" ;
- else
- if original_character = "[" then find_character := "]" ;
- else
- if original_character = "{" then find_character := "}" ;
- else
- if original_character = "<" then find_character := ">" ;
- ! EFE.TPU 25-APR-1991 18:18 PAGE 35
- else message("Current character is not a valid starting delimiter. " +
- "Must be (,[,{, or < .");
- return;
- endif;
- endif;
- endif;
- endif;
- if original_character = "(" then efe$find_matching("(",")");
- else
- if original_character = "[" then efe$find_matching("[","]");
- else
- if original_character = "{" then efe$find_matching("{","}");
- else
- if original_character = "<" then efe$find_matching("<",">");
- endif;
- endif;
- endif;
- endif;
- if current_character <> find_character then
- message(find_character + ' not found!');
- position(original_position);
- return;
- endif;
- found_target := mark(bold);
- set(screen_update,on);
- update(current_window);
- EVE$PROMPT_STRING("",response,
- "Return to original (boxed) search position? [Yes] ","");
- edit(response,UPPER);
- if SUBSTR(response,1,1) = "Y" then position(original_position);
- else
- if SUBSTR(response,1,1) = "" then position(original_position);
- endif;
- endif;
- set(screen_update,on);
- endprocedure; !efe$find_match
-
-
- ! EFE.TPU 25-APR-1991 18:18 PAGE 36
- procedure efe$find_matching(match_left,match_right)
- local next_close, ! Marks next closing paren
- next_open, ! Marks next open paren
- next_close_mark,
- next_open_mark,
- temp_mark;
- on_error ! Ignore search fails
- endon_error;
- loop
- move_horizontal (1);
- next_close := search (match_right,forward);
- if next_close = 0 then
- return (0);
- else
- temp_mark := mark(none);
- position (next_close);
- next_close_mark := mark(none);
- position (temp_mark);
- endif;
- next_open := search (match_left,forward);
- if next_open <> 0 then
- position (next_open);
- next_open_mark := mark(none);
- if next_open_mark < next_close_mark then
- if (not efe$find_matching(match_left,match_right)) then
- return (0);
- endif;
- else
- position (next_close);
- exitif 1;
- endif;
- else
- position (next_close);
- exitif 1;
- endif;
- endloop;
- return (1);
- endprocedure; !efe$find_matching
-