home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / D / SVGALIB / SVGALIB1.TAR / svgalib / svpmi / parse.c next >
Encoding:
C/C++ Source or Header  |  1994-03-31  |  4.6 KB  |  233 lines

  1.  
  2. /*
  3.  * This is a quickly hacked program to convert an SVPMI (Super VGA Protected
  4.  * Mode Interface) data file to an svgalib driver. Feedback is
  5.  * very welcome.
  6.  *
  7.  * Initial version (Mar 94 HH). Doesn't do much yet.
  8.  * Assumes textmode is last defined mode.
  9.  * End with ctrl-c. Correct resulting files by hand.
  10.  * (add "}" to modetable.svpmi)
  11.  */
  12.  
  13.  
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16. #include <string.h>
  17.  
  18.  
  19. void parse();
  20.  
  21.  
  22. void main()
  23. {
  24.     parse();
  25. }
  26.  
  27.  
  28. /* Return pointer to line red from stdin, end marked by CR or CR/LF.
  29.  * Initial spaces are removed. */
  30.  
  31. char *getline()
  32. {
  33.     static char linebuf[128];
  34.     int i, length, spaces;
  35.     i = 0;
  36.     for (;;) {
  37.         int c;
  38.         c = fgetc(stdin);
  39.         if (feof(stdin))
  40.             return NULL;
  41.         if (c == 13)
  42.             continue;    /* Skip. */
  43.         if (c == 10)
  44.             break;
  45.         linebuf[i] = c;
  46.         i++;
  47.     }
  48.     length = i;
  49.     linebuf[i] = 0;
  50.     /* Remove initial spaces. */
  51.     spaces = 0;
  52.     i = 0;
  53.     while (i < length) {
  54.         if (linebuf[i] != ' ')
  55.             break;
  56.         i++;
  57.         spaces++;
  58.     }
  59.     return linebuf + spaces;
  60. }
  61.  
  62.  
  63. /* Skip lines until left side of line matches string s. */
  64.  
  65. char *getthisline( char *s )
  66. {
  67.     char buf[128];
  68.     int n;
  69.     n = strlen(s);
  70.     for (;;) {
  71.         char *line;
  72.         line = getline();
  73.         if (strncmp(line, s, n) == 0)
  74.             return line;
  75.     }
  76. }
  77.  
  78.  
  79. /* Get the (n + 1)th word delimited by ' ' and ';' in string s. */
  80.  
  81. char *getword( char *s, int n ) {
  82.     int i;
  83.     char *word;
  84.     int mode, wcount;
  85.     word = s;
  86.     mode = 0;    /* Whitespace. */
  87.     wcount = 0;
  88.     i = 0;
  89.     for (i = 0; s[i] != 0; i++) {
  90.         if (s[i] == ' ' || s[i] == ';')
  91.             if (mode == 0)
  92.                 continue;
  93.             else {
  94.                 s[i] = 0;
  95.                 if (wcount == n)
  96.                     return word;
  97.                 wcount++;
  98.                 mode = 0;
  99.             }
  100.         else
  101.             if (mode == 1)
  102.                 continue;
  103.             else {
  104.                 word = &s[i];
  105.                 mode = 1;
  106.             }
  107.     }
  108.     return NULL;
  109. }
  110.  
  111.  
  112. /* Write lines to file until left part matches string s. */
  113.  
  114. void writetofileuntilthisline( char *s, FILE *f ) {
  115.     int n;
  116.     n = strlen(s);
  117.     for (;;) {
  118.         char *line;
  119.         line = getline();
  120.         if (strncmp(line, s, n) == 0)
  121.             break;
  122.         fprintf(f, "%s\n", line);
  123.     }
  124. }
  125.  
  126.  
  127. void writetofileuntilend( FILE *f ) {
  128.     for (;;) {
  129.         char *line;
  130.         line = getline();
  131.         if (line == NULL)
  132.             return;
  133.         fprintf(f, "%s\n", line);
  134.     }
  135. }
  136.  
  137.  
  138. void parse() {
  139.     char *line;
  140.     char s[128];
  141.     char modename[40];
  142.     int modenumber;
  143.     FILE *f, *g;
  144.     printf("SVPMI to svgalib driver converter.\n\n");
  145.  
  146.     /* Read header. */
  147.     getthisline("[ADAPTER]");
  148.     line = getline();
  149.     printf("Graphics Adapter string: %s\n", line);
  150.     
  151.     /* Read modes. */
  152.     modenumber = 0;
  153.     g = fopen("modetable.svpmi", "wb");
  154.     f = fopen("modes.svpmi", "wb");
  155.     fprintf(g, "/* svgalib SVPMI mode table. */\n\n");
  156.     fprintf(g, "static svpmi_modeentry svpmi_modes[] = {\n");
  157.  
  158.     for (;;) {
  159.         int XResolution;    /* SVPMI modeinfo fields. */
  160.         int YResolution;
  161.         int BitsPerPixel;
  162.         int BytesPerScanline;
  163.         int WinAGranularity;
  164.         int WinASize;
  165.         int WinABase;
  166.         int ModeAttributes;
  167.         getthisline("[MODEINFO]");
  168.         line = getthisline("ModeAttributes");
  169.         ModeAttributes = atoi(getword(line, 2));
  170.         line = getthisline("WinAGranularity");
  171.         WinAGranularity = atoi(getword(line, 2));
  172.         line = getthisline("WinASize");
  173.         WinASize = atoi(getword(line, 2));
  174.         line = getthisline("WinABase");
  175.         WinABase = atoi(getword(line, 2));
  176. #if 0
  177.         if (WinABase != 0xa0000) {
  178.             printf("Window is not at 0xa0000.\n");
  179.             exit(-1);
  180.         }
  181. #endif        
  182.         line = getthisline("BytesPerScanline");
  183.         BytesPerScanline = atoi(getword(line, 2));
  184.         line = getthisline("XResolution");
  185.         XResolution = atoi(getword(line, 2));
  186.         line = getthisline("YResolution");
  187.         YResolution = atoi(getword(line, 2));
  188.         line = getthisline("BitsPerPixel");
  189.         BitsPerPixel = atoi(getword(line, 2));
  190.  
  191.         if (ModeAttributes == 0x07) {
  192.             /* Text mode. */
  193.             printf("Textmode found.\n");
  194.             getthisline("[SETMODE]");
  195.             fprintf(f, "static void svpmi_setmode_text() {\n");
  196.             writetofileuntilend(f);
  197.             fprintf(f, "}\n\n\n");
  198.             fprintf(g, "}\n");
  199.             fclose(f);
  200.             fclose(g);
  201.             exit(0);
  202.         }
  203.  
  204.         printf("Mode found: %d x %d, %dbpp  %d bpl  gran A %d\n",
  205.             XResolution, YResolution, BitsPerPixel,
  206.             BytesPerScanline, WinAGranularity);
  207.  
  208.         sprintf(modename, "%dx%dx%d", XResolution, YResolution,
  209.             1 << BitsPerPixel);
  210.  
  211.         getthisline("[SETMODE]");
  212.         fprintf(f, "static void svpmi_setmode_%s() {\n", modename);
  213.         writetofileuntilthisline("[SETCOLOR]", f);
  214.         fprintf(f, "}\n\n\n");
  215.         getthisline("[SETWINDOW]");
  216.         fprintf(f, "static void svpmi_setwindow_%s( int r0 ) {\n", modename);
  217.         writetofileuntilthisline("[MODE]", f);
  218.         fprintf(f, "}\n\n\n");
  219.  
  220.         fprintf(g, "{ %d, %d, %d, %d, %d, svpmi_setmode_%s, svpmi_setwindow_%s },\n",
  221.             XResolution, YResolution, BitsPerPixel,
  222.             BytesPerScanline, WinAGranularity, modename, modename);
  223.  
  224.         fflush(f);
  225.         fflush(g);
  226.  
  227.         modenumber++;
  228.     }
  229.     fprintf(g, "}\n");
  230.     fclose(f);
  231.     fclose(g);
  232. }
  233.