--- /dev/null
+/* The cheapest, quickest to write program I can make up to strip line numbers.\r// The line number field is variable width and has optional leading whitespace.\r// Written by Joel Rees, Takino, Hyogo, Japan, January 2000.\r// Too Q&D to bother copyrighting, assigned to the public domain.\r// Since it is in the public domain, it can't be copyrighted. \r// Your personal expression of it may be copyrightable, however.\r//\r// The changes in my programing style prove that I am turning Japanese.\r// Current e-mail: joel_rees@sannet.ne.jp, reiisi@nettaxi.com\r*/\r\r\r/* #define ON_Macintosh */\r\r\r#include <stdio.h>\r#include <stdlib.h>\r#include <ctype.h>\r\r\r#if defined ON_Macintosh\r# pragma push\r# pragma only_std_keywords off\r# include <Types.h>\r# include <Fonts.h>\r# pragma pop\r#endif\r\r\r#if defined ON_Macintosh\r# include <sioux.h>\r# include <console.h>\r#endif\r\r\r#define BUFFERCHARS 1024\r#define BUFFSIZE ( BUFFERCHARS + 1 ) /* One shot, should be no lines this large anyway. */\r#define LABELCHARS 16 /* I think it was only up to 8, but 16 to be safe. */\r#define LABELSIZE ( LABELCHARS + 1 ) /* I think it was only up to 8, but 16 to be safe. */\r#define NAMECHARS 31\r#define NAMESIZE ( NAMECHARS + 1 )\r#define EXPRESSIONCHARS 64 /* Way overkill. */\r#define EXPRESSIONSIZE ( EXPRESSIONCHARS + 1 )\r\r\r#define SPACE ' '\r\r\rchar * derelative( char buffer[] )\r{ char * scan = buffer;\r int ch;\r while ( ( ( ch = * scan ) != '\0' )\r && ( ch != '-' ) && ( ch != '+' ) )\r { ++scan;\r }\r if ( scan > buffer )\r { *scan = '\0';\r return buffer;\r }\r}\r\r\rchar * prefixHeaderAddress( char buffer[] )\r{ return isdigit( buffer[ 0 ] ) ? "" : "(natural_t) &h";\r}\r\r\rint nocaseCompare( char * range, char * object )\r{ int difference = 0;\r /* printf( "comparing %s in %s:", object, range ); */\r do\r { difference = ( toupper( * range++ ) - toupper( * object++ ) );\r /* printf( "%d,", difference ); */\r } while ( ( difference == 0 ) && ( * object != '\0' ) ); /* terminating NUL is convenient in the math. */\r /* printf( "%d\n", difference ); */\r return difference;\r}\r\r\rchar * nocaseScan( char * range, char * object )\r{ char * inObject = object;\r while ( ( * range != '\0' ) && ( nocaseCompare( range, object ) != 0 ) ) /* Not going for speed. */\r { ++range;\r }\r return ( * range == '\0' ) ? NULL : range;\r}\r\r\rchar * guardedCopy( char target[], char source[], size_t limit )\r{ target[ limit ] = '\0';\r strncpy( target, source, limit );\r}\r\r\r#if defined NOT_USING_THIS\r/* Decided I want to try to matche fgets(). */\rsize_t readline( FILE * file, char buffer[], size_t limit )\r{ size_t i;\r int ch;\r int lookahead;\r for ( i = 0; i < limit; ++i )\r { ch = fgetc( file );\r if ( ch == EOF )\r { buffer[ i ] = '\0';\r --i; /* Report the count of stored characters. */\r break;\r }\r else if ( ( ch == '\n') || ( ch == '\r' ) )\r { if ( i == limit - 1 )\r { ungetc( ch, file );\r buffer[ i ] = '\0';\r --i; /* Report the count of stored characters. */\r }\r else \r { buffer[ i ] = '\n'; /* convert to standard C library new line */\r buffer[ i + 1 ] = '\0';\r lookahead = fgetc( file );\r if ( ( ( ch == '\n' ) && ( lookahead != '\r' ) )\r || ( ( ch == '\r' ) && ( lookahead != '\n' ) ) )\r { ungetc( lookahead ); /* Don't drop it. */\r }\r /* If it was a CRLF or LFCR, drop the second of the pair. */\r }\r break;\r }\r else\r { buffer[ i ] = (char) ch;\r }\r }\r return i;\r}\r#endif /* defined NOT_USING_THIS */\rsize_t readline( FILE * file, char buffer[], size_t limit )\r{ size_t i;\r int ch;\r int lookahead;\r --limit; /* store limit - 1 characters */\r for ( i = 0; i < limit; ++i )\r { ch = fgetc( file );\r if ( ch == EOF )\r { break;\r }\r else if ( ( ch == '\n') || ( ch == '\r' ) )\r {\r buffer[ i++ ] = '\n'; /* convert to standard C library new line for the platform */\r lookahead = fgetc( file );\r if ( ( ( ch == '\n' ) && ( lookahead != '\r' ) )\r || ( ( ch == '\r' ) && ( lookahead != '\n' ) ) )\r { ungetc( lookahead, file ); /* Not a pair, don't drop it. */\r }\r /* If it was a CRLF or LFCR, drop the second of the pair. */\r break;\r }\r else\r { buffer[ i ] = (char) ch;\r }\r }\r buffer[ i ] = '\0';\r return i;\r}\r\r\rint main( int argc, char * argv[] )\r{\r int ch;\r FILE * input = stdin;\r int fdbFlag = 0;\r int dotHFlag = 0;\r char label[ LABELSIZE ] = { '\0' };\r char name[ NAMESIZE ] = { '\0' };\r char searchMode[ EXPRESSIONSIZE ] = { '\0' };\r char linkMode[ EXPRESSIONSIZE ] = { '\0' };\r char allocLink[ EXPRESSIONSIZE ] = { '\0' };\r char parentLink[ EXPRESSIONSIZE ] = { '\0' };\r char leftLink[ EXPRESSIONSIZE ] = { '\0' };\r char rightLink[ EXPRESSIONSIZE ] = { '\0' };\r char lastLabel[ LABELSIZE ] = { '\0' };\r char characteristic[ LABELSIZE ] = { '\0' };\r#define HeaderWait 0\r#define HeaderNameRead 1\r#define HeaderNamed 2\r#define HeaderLinkModeRead 3\r#define HeaderLinked 4\r#define HeaderParented 5\r#define HeaderLefted 6\r#define HeaderRighted 7\r#define HeaderComplete 8\r int headerState = HeaderWait;\r/* */\r# if defined ON_Macintosh\r { Str31 name = "\pOsaka\81|\93\99\95\9d";\r short familyID = 0;\r /* */\r GetFNum( name, &familyID );\r SIOUXSettings.fontsize = 12;\r SIOUXSettings.fontid = familyID;\r SIOUXSettings.showstatusline = 1;\r argc = ccommand( &argv );\r }\r# endif\r /* Use the pseudo-command-line as simple file interface\r // argc = ccommand( &argv ); \r */\r if ( argc > 1 )\r { int arg;\r for ( arg = 1; arg < argc; ++arg )\r { if ( ( argc == 2 ) || ( ( strcmp( argv[ arg ], "-f" ) == 0 ) && ( ++arg < argc ) ) )\r { input = fopen( argv[ arg ], "rb" );\r if ( input == NULL )\r { fprintf( stderr, "Failed to open %s\n", argv[ arg ] );\r return EXIT_FAILURE;\r }\r }\r else if ( strcmp( argv[ arg ], "-fdb" ) == 0 )\r { fdbFlag = 1;\r }\r else if ( strcmp( argv[ arg ], "-.h" ) == 0 )\r { dotHFlag = 1;\r }\r /* else if ( ( strcmp( argv[ arg ], "-e" ) == 0 ) && ( ++arg < argc ) )\r {\r } \r */\r else\r { fprintf( stderr, "Unknown option #%d: %s\n", arg, argv[ arg ] );\r }\r }\r }\r/* */\r while ( !feof( input ) )\r {\r char buffer[ BUFFSIZE ];\r char * scan = buffer;\r size_t lineLength;\r int found = 0;\r#define FoundFCC 1\r#define FoundFCB 2\r#define FoundFDB 3\r char * labelMark = NULL;\r char * operatorMark = NULL;\r char * operandMark = NULL;\r char * commentMark = NULL;\r \r buffer[ 0 ] = '\0'; /* In case EOF comes on a completely empty line. */\r lineLength = readline( input, buffer, BUFFSIZE );\r if ( buffer[ lineLength - 1 ] == '\n' ) /* Assuming all lines shorter than the buffer. */\r { buffer[ lineLength - 1 ] = '\0';\r }\r /* printf( "length of buffer: %d\n\n", strlen( buffer ) ); */\r while ( isspace( * scan ) )\r { ++scan; \r }\r while ( isdigit( * scan ) ) /* Bump past the line number. */\r { ++scan;\r }\r if ( * scan == SPACE )\r { ++scan; /* Move past the delimiting space. */\r }\r if ( !fdbFlag && !dotHFlag )\r { fputs( scan, stdout );\r fputc( '\n', stdout );\r continue; /* Nothing more to do in strip line number mode. */\r }\r if ( * scan == '\0' )\r { continue; /* empty line */\r }\r else if ( * scan == '*' )\r { continue; /* comment line */\r }\r if ( ( * scan != '\0' ) && !isspace( * scan ) ) /* Don't want to lose track of whether we tested NUL. */\r { labelMark = scan++; /* Saves us a symbol table. I'm pretty sure I didn't put any labels beyond this point. */\r while ( !isspace( * scan ) )\r { ++scan;\r }\r * scan++ = '\0'; /* Make the label its own string. */\r }\r while ( isspace( * scan ) )\r { ++scan;\r }\r if ( * scan != '\0' )\r { operatorMark = scan;\r while ( ( * scan != '\0' ) && !isspace( * scan ) )\r { ++scan;\r }\r if ( * scan != '\0' )\r { *scan++ = '\0';\r while ( isspace ( * scan ) )\r { ++scan;\r }\r }\r }\r if ( ( operatorMark != NULL ) && ( nocaseCompare( operatorMark, "FCC" ) == 0 ) )\r { char quotechar = * scan;\r found = FoundFCC;\r if ( quotechar != '\0' )\r { ++scan;\r operandMark = scan;\r }\r while ( ( * scan != '\0' ) && ( * scan != quotechar ) )\r { ++scan;\r }\r if ( * scan != '\0' )\r { * scan++ = '\0';\r while ( isspace ( * scan ) )\r { ++scan;\r }\r }\r if ( * scan != '\0' )\r { commentMark = scan;\r }\r if ( ( operandMark != NULL ) && ( headerState == HeaderWait ) )\r { guardedCopy( name, operandMark, NAMECHARS );\r headerState = HeaderNameRead;\r }\r }\r else if ( ( operatorMark != NULL ) && ( nocaseCompare( operatorMark, "FCB" ) == 0 ) )\r { found = FoundFCB;\r operandMark = scan;\r while ( ( * scan != '\0' ) && !isspace( * scan ) )\r { ++scan;\r }\r if ( * scan != '\0' )\r { * scan++ = '\0';\r while ( isspace ( * scan ) )\r { ++scan;\r }\r }\r if ( * scan != '\0' )\r { commentMark = scan;\r }\r switch ( headerState )\r {\r case HeaderNameRead:\r guardedCopy( searchMode, operandMark, EXPRESSIONCHARS );\r headerState = HeaderNamed;\r break;\r case HeaderNamed:\r guardedCopy( linkMode, operandMark, EXPRESSIONCHARS );\r headerState = HeaderLinkModeRead;\r break;\r }\r }\r else if ( ( operatorMark != NULL ) && ( nocaseCompare( operatorMark, "FDB" ) == 0 ) )\r { found = FoundFDB;\r operandMark = scan;\r while ( ( * scan != '\0' ) && !isspace( * scan ) )\r { ++scan;\r }\r if ( * scan != '\0' )\r { * scan++ = '\0';\r while ( isspace ( * scan ) )\r { ++scan;\r }\r }\r if ( * scan != '\0' )\r { commentMark = scan;\r }\r switch ( headerState )\r {\r case HeaderLinkModeRead:\r guardedCopy( allocLink, operandMark, EXPRESSIONCHARS );\r headerState = HeaderLinked;\r break;\r case HeaderLinked:\r guardedCopy( parentLink, operandMark, EXPRESSIONCHARS );\r headerState = HeaderParented;\r break;\r case HeaderParented:\r guardedCopy( leftLink, operandMark, EXPRESSIONCHARS );\r headerState = HeaderLefted;\r break;\r case HeaderLefted:\r guardedCopy( rightLink, operandMark, EXPRESSIONCHARS );\r headerState = HeaderRighted;\r break;\r }\r }\r else\r { if ( ( headerState == HeaderRighted ) && ( labelMark != NULL ) && ( operatorMark != NULL ) )\r { guardedCopy( label, labelMark, LABELCHARS );\r if ( ( toupper( operatorMark[ 0 ] ) == 'D' ) && ( ( toupper( operatorMark[ 1 ] ) == 'O' ) ) )\r { guardedCopy( characteristic, operatorMark + 1, LABELCHARS );\r characteristic[ 0 ] = 'X';\r }\r else\r { guardedCopy( characteristic, labelMark, LABELCHARS );\r }\r headerState = HeaderComplete;\r }\r }\r if ( headerState == HeaderComplete )\r { if ( dotHFlag )\r { printf( "extern definition_header_s h%s;\n", label );\r if ( strcmp( label, characteristic ) == 0 )\r { printf( "extern void %s(void);\n", label );\r }\r }\r if ( fdbFlag )\r {\r fputs( "*/\n", stdout );\r printf( "static character_t s%s[] = \"\\x%x\" \"%s\";\n", label, strlen( name ), name );\r printf( "definition_header_s h%s = \n", label );\r printf( "{\t{ (natural_t) s%s },\n", label );\r printf( "\t{ %s },\n", searchMode );\r derelative( allocLink );\r printf( "\t{ %s%s },\n", prefixHeaderAddress( allocLink ), allocLink ); /* Need to see comments? */\r printf( "\t{ %s },\n", linkMode );\r derelative( parentLink );\r printf( "\t{ %s%s },\n", prefixHeaderAddress( parentLink ), parentLink );\r derelative( leftLink );\r printf( "\t{ %s%s },\n", prefixHeaderAddress( leftLink ), leftLink );\r derelative( rightLink );\r printf( "\t{ %s%s },\n", prefixHeaderAddress( rightLink ), rightLink );\r printf( "\t{ (natural_t) %s }%s\n", \r characteristic, \r ( strcmp( label, characteristic ) == 0 ) ? "\n};" : "," \r );\r fputs( "/*\n", stdout );\r }\r headerState = HeaderWait;\r }\r else if ( fdbFlag && ( found == FoundFDB ) \r && ( ( headerState == HeaderComplete ) || ( headerState == HeaderWait ) ) )\r { if ( labelMark != NULL )\r { printf( "/* %s: */\n", labelMark );\r }\r fputs( "\t\t{ (natural_t) &h", stdout );\r if ( operandMark != NULL )\r { fputs( operandMark, stdout ); \r }\r fputs( "\t},", stdout );\r if ( commentMark != NULL )\r { fputs( "\t/* ", stdout );\r fputs( commentMark, stdout );\r fputs( " */", stdout );\r }\r fputc( '\n', stdout );\r }\r }\r return EXIT_SUCCESS;\r}\r\r
\ No newline at end of file