+! mkskel.tpu
+! usage:
+! edit/TPU/noDisplay/noSection/Command=mkskel.tpu flex.skl /Output=skel.c
+!
+! Create a C source file from the flex skeleton data. Copy the file,
+! changing backslash (\) to doubled backslash (\\) and quote (")
+! to backslash quote (\"). For each line, insert space+space+quote
+! at the beginning and quote+comma at the end. Bracket the updated
+! text with several lines of prologue and epilogue.
+!
+ skelfile := CREATE_BUFFER("file", GET_INFO(COMMAND_LINE, "file_name"));
+ SET(NO_WRITE, skelfile);
+ target := '"' | '\'; !do this once, outside loops
+ POSITION(BEGINNING_OF(skelfile)); !start here
+ rest_of_line := CREATE_RANGE(MARK(NONE), MARK(NONE)); !also outside loops
+ LOOP
+ EXITIF MARK(NONE) = END_OF(skelfile); !are we done yet?
+ COPY_TEXT(' "'); start_pos := MARK(NONE);
+ POSITION(LINE_END); end_pos := MARK(NONE);
+ MODIFY_RANGE(rest_of_line, start_pos, end_pos);
+ LOOP
+ next_match := SEARCH_QUIETLY(target, FORWARD, EXACT, rest_of_line);
+ EXITIF next_match = 0;
+ POSITION(BEGINNING_OF(next_match));
+ COPY_TEXT('\'); MOVE_HORIZONTAL(1); !past the matched character
+ MODIFY_RANGE(rest_of_line, MARK(NONE), end_pos);
+ ENDLOOP;
+ POSITION(LINE_END); COPY_TEXT('",');
+ MOVE_VERTICAL(1); POSITION(LINE_BEGIN); !go to next line
+ ENDLOOP;
+
+ POSITION(BEGINNING_OF(skelfile)); !insert five line prologue
+ COPY_TEXT('/* File created from flex.skl via mkskel.tpu */'); SPLIT_LINE;
+ SPLIT_LINE;
+ COPY_TEXT('#include "flexdef.h"'); SPLIT_LINE;
+ SPLIT_LINE;
+ COPY_TEXT('const char *skel[] = {'); SPLIT_LINE;
+
+ POSITION(END_OF(skelfile)); !append two line epilogue
+ COPY_TEXT(' 0'); SPLIT_LINE;
+ COPY_TEXT('};'); !! SPLIT_LINE;
+
+ WRITE_FILE(skelfile, GET_INFO(COMMAND_LINE, "output_file"));
+ QUIT
+!--<eof>--