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