OSDN Git Service

Baseline, with the license notices in README.TXT and BIFDOC.TXT.
[bif-6809/bif-6809.git] / junkbox / stripln.c
diff --git a/junkbox/stripln.c b/junkbox/stripln.c
new file mode 100644 (file)
index 0000000..24130af
--- /dev/null
@@ -0,0 +1 @@
+/* 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