Home | History | Annotate | Download | only in VMS
      1 !  mkskel.tpu
      2 !       usage:
      3 !  edit/TPU/noDisplay/noSection/Command=mkskel.tpu flex.skl /Output=skel.c
      4 !
      5 !  Create a C source file from the flex skeleton data.  Copy the file,
      6 !       changing backslash (\) to doubled backslash (\\) and quote (")
      7 !       to backslash quote (\").  For each line, insert space+space+quote
      8 !       at the beginning and quote+comma at the end.  Bracket the updated
      9 !       text with several lines of prologue and epilogue.
     10 !
     11    skelfile := CREATE_BUFFER("file", GET_INFO(COMMAND_LINE, "file_name"));
     12    SET(NO_WRITE, skelfile);
     13    target := '"' | '\';                         !do this once, outside loops
     14    POSITION(BEGINNING_OF(skelfile));            !start here
     15    rest_of_line := CREATE_RANGE(MARK(NONE), MARK(NONE));  !also outside loops
     16    LOOP
     17       EXITIF MARK(NONE) = END_OF(skelfile);     !are we done yet?
     18       COPY_TEXT('  "');  start_pos := MARK(NONE);
     19       POSITION(LINE_END);  end_pos := MARK(NONE);
     20       MODIFY_RANGE(rest_of_line, start_pos, end_pos);
     21       LOOP
     22 	 next_match := SEARCH_QUIETLY(target, FORWARD, EXACT, rest_of_line);
     23 	 EXITIF next_match = 0;
     24 	 POSITION(BEGINNING_OF(next_match));
     25 	 COPY_TEXT('\');  MOVE_HORIZONTAL(1);   !past the matched character
     26 	 MODIFY_RANGE(rest_of_line, MARK(NONE), end_pos);
     27       ENDLOOP;
     28       POSITION(LINE_END);  COPY_TEXT('",');
     29       MOVE_VERTICAL(1);  POSITION(LINE_BEGIN);  !go to next line
     30    ENDLOOP;
     31 
     32    POSITION(BEGINNING_OF(skelfile));            !insert five line prologue
     33    COPY_TEXT('/* File created from flex.skl via mkskel.tpu */');   SPLIT_LINE;
     34 								   SPLIT_LINE;
     35    COPY_TEXT('#include "flexdef.h"');                              SPLIT_LINE;
     36 								   SPLIT_LINE;
     37    COPY_TEXT('const char *skel[] = {');                            SPLIT_LINE;
     38 
     39    POSITION(END_OF(skelfile));                  !append two line epilogue
     40    COPY_TEXT('  0');                                               SPLIT_LINE;
     41    COPY_TEXT('};');                                             !! SPLIT_LINE;
     42 
     43    WRITE_FILE(skelfile, GET_INFO(COMMAND_LINE, "output_file"));
     44    QUIT
     45 !--<eof>--
     46