#include #include #include char buff[1000]; char *icstr[160], *ccstr[256]; char invalid[] = "Invalid"; char *tailfmt = ""; char *tailmsg; void doit(int n, char *buff, FILE *htmlout) { char m = buff[4]; char m2 = buff[5]; char *msg = buff+7; int i = strlen(buff); printf(tailfmt, tailmsg); // finish off the previous entry while ( buff[--i] <= ' ' ) ; buff[i+1] = 0; buff[3] = 0; if ( *msg == '.' ) // what was this for? msg = buff; printf(" /* --------------- */\n"); printf(" case %d: // %s - %s\n", n, buff, msg); tailfmt = " notImplemented(\"%s\");\n break;\n"; tailmsg = strdup(msg); icstr[n] = tailmsg; if ( htmlout != NULL ) if ( buff[1] == '7' ) // jump instruction fprintf(htmlout, "%s gen %s\n", buff, buff, msg); else fprintf(htmlout, "%s gen %s\n", buff, buff, buff, msg); } main(int argc, char **argv) { FILE *fin = fopen(argv[1], "r"); FILE *fin2 = NULL; FILE *htmlout = NULL; char *msg = NULL; int n0 = -1; // previous value of n, enables test for special variants int n; int i; for ( i = 0; i<160; i++ ) icstr[i] = invalid; for ( i = 0; i<256; i++ ) ccstr[i] = invalid; if ( argc >=3 ) // template file specified as first param { while ( *fgets(buff, 999, fin) != '*' ) // look for * in column 1 fputs(buff, stdout); fin2 = fin; fin = fopen(argv[2], "r"); } if ( argc >=4 ) // HTML file specified as last param { htmlout = fopen(argv[3], "w"); fprintf(htmlout, "
\n"); // lazy heading
   }

   while  ( *fgets(buff, 999, fin) != '-' )
      if  ( *buff == ' ' )
      {  printf("         %s", buff);    // code insert -- buff ends with \n
         if  ( memcmp(buff, "   // drop", 10) == 0 )      // drop through to next action
            tailfmt = "\n";
         else
            tailfmt = "            break;\n";
      // if  ( htmlout != NULL )
      //    fputs(buff, htmlout);
      }
      else
         doit(atoi(buff), buff, htmlout);

   printf(tailfmt, tailmsg);         // finish off the previous entry
   tailfmt = "";
   printf("        /* --------------- */\n");

   n0 = 0;
   while  ( *fgets(buff, 999, fin) != '-' )
   {  n = 9;
      while  ( buff[++n] != 0  &&  buff[n] < 'a' ) ;    // skip over block letter heading
      if  ( 0 == 0 )                              // found lower case characters
      {  while  ( buff[--n] > 'Z'  || buff[n] < 'A' ) ; // back skip to end of block letter heading
         if  ( buff[n+1] == ')' )
            n += 2;
      }
      buff[n] = 0;
      n = atoi(buff);                                   // order code + 100
      icstr[n] = "Leo CODE";
      if  ( n != n0 )
         printf("         case %d:           // %s\n", n, buff);
      else
         printf("           // %d:              %s\n", n, buff);
      n0 = n;
      n = (n - 100) * 8;
      msg = strdup(buff+8);
      if  ( buff[4] == 'd'  &&  buff[6] == 'm' )        // xxx/d/m
      {  for  ( i = 1; i<8; i++ )
         ccstr[n+i] = msg;
      }
      else if  ( buff[4] == 'd' )
      {  n += buff[6] - '0';
         ccstr[n+4] = msg;
      }
      else if  ( buff[6] == 'm' )
      {  if  ( buff[4] == '1' )
            n += 4;
         ccstr[n+1] = msg;  ccstr[n+2] = msg;  ccstr[n+3] = msg;
      }
      else if  ( buff[4] == '1' )
         n += 4 + buff[6] - '0';
      else
         n += buff[6] - '0';
      ccstr[n] = msg;                                   // unmodified short form instruction
   // printf("// Setting %d to %s\n", n, msg); 
   }
   printf("            computerCode(act, ref, item, lit, disc, mod);\n");
   printf("            break;\n");

   printf("        /* --------------- */\n");

   while  ( fgets(buff, 999, fin) != NULL )
      if  ( *buff == ' ' )
      {  printf("         %s", buff);    // code insert -- buff ends with \n
         tailfmt = "            break;\n";
      // if  ( htmlout != NULL )
      //    fputs(buff, htmlout);
      }
      else
         doit(atoi(buff), buff, htmlout);

   printf(tailfmt, tailmsg);         // finish off the previous entry

   printf("        /* --------------- */\n");

   printf("        ");
   for  ( i = 0; i<100; i++ )
      if  ( icstr[i] == invalid )
         printf(" case %d:", i);

   printf("\n        ");
   for  ( i = 100; i<140; i++ )
      if  ( icstr[i] == invalid )
         printf(" case %d:", i);

   printf("\n        ");
   for  ( i = 140; i<160; i++ )
      if  ( icstr[i] == invalid )
         printf(" case %d:", i);

   printf("\n            notImplemented(\"%s\");\n", "Unknown instruction");

   printf("        /* --------------- */\n");

   if  ( fin2 != NULL )
   {  while  ( *fgets(buff, 999, fin2) != 'm' )          // main prog declaration
         fputs(buff, stdout);

      printf("\n// Initialise diagnostic arrays\n");

      printf("char *icstr[] = {\n");
      for ( i = 0; i<160; i++ )
         printf("  \"%s\",\n", icstr[i]);
      printf("  \"blank\"};\n");

      for ( i = 0; i<256; i++ )   // chop off trailing spaces
      {  msg = ccstr[i];
         msg += strlen(msg);
         while  ( *--msg <= ' ' ) ;
         *(msg+1) = 0;
      }

      printf("char *ccstr[] = {");
      for ( i = 0; i<255; i++ )
         if  ( (i&7) == 0 )
            printf("\n  \"%s\",", ccstr[i]);
         else
            printf(" \"%s\",", ccstr[i]);
      printf("  \"%s\"};\n", ccstr[255]);

      printf("\n");

      fputs(buff, stdout);

      while  ( fgets(buff, 999, fin2) != NULL )
         fputs(buff, stdout);
   }

   if  ( htmlout != NULL )
      fprintf(htmlout, "
\n"); }