46 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
!  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>--
 |