| ! 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>-- |