home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Lib / charset / gc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  5.2 KB  |  185 lines

  1. /* gc.c - generates the required mappings */
  2.  
  3.  
  4. # ifndef lint
  5. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/charset/RCS/gc.c,v 6.0 1991/12/18 20:21:39 jpo Rel $";
  6. # endif
  7.  
  8. /*
  9.  * $Header: /xtel/pp/pp-beta/Lib/charset/RCS/gc.c,v 6.0 1991/12/18 20:21:39 jpo Rel $
  10.  *
  11.  * $Log: gc.c,v $
  12.  * Revision 6.0  1991/12/18  20:21:39  jpo
  13.  * Release 6.0
  14.  *
  15.  */
  16.  
  17.  
  18.  
  19. #include    <stdio.h>
  20. #include    <ctype.h>
  21. #include    "charset.h"
  22.  
  23. #define    AMAX    2000
  24.  
  25. extern char    *charset_sets, *charset_defs, *charset_map, *charset_mnem;
  26. extern char    *charset_dir;
  27. /* char charset_sets[] = "CHARSETS"; */
  28. /* char charset_defs[] = "CHARDEFS"; */
  29. /* char charset_map[] = "CHARMAP.10646"; */
  30. /* char charset_mnem[] = "MNEM"; */
  31. /* char charset_dir[] = "cs"; */
  32.  
  33. FILE        *f,*g,*h;
  34. CHAR8U        s[LSIZE], c[AMAX], ref[C256], cmd[LSIZE];
  35. INT16S        v[AMAX], l[AMAX], codetable[C256];
  36. int        i,mx,a,cv,val,cod,dupl,ecma,line,group,plane,row,cell,num;
  37.  
  38. gwrite() {
  39.     if (g) {
  40.         for (i= 0; i < C256; i++)
  41.             if (c[codetable[i]] == NULL)
  42.                 c[codetable[i]] = i;
  43.         fwrite (codetable,2,C256,g);
  44.         fwrite (c,1,mx,g);
  45.         fclose (g);
  46.     }
  47. }
  48.  
  49. FILE *
  50. fopener (file,mode)
  51. char *file, *mode;
  52. {
  53.     FILE *f;
  54.     f= fopen (file,mode);
  55.     if (f == (FILE *)NULL) {
  56.         (void) fprintf (stderr,"*** Error: unable to open %s\n", file);
  57.         exit (1);
  58.     }
  59.     return f;
  60. }
  61.  
  62. main (argc,argv) int argc; char **argv; {
  63.     CHAR8U    defname[LSIZE], linkname[LSIZE], *p;
  64.  
  65.     mx= 0; line= 0;
  66.  
  67.     f= fopener (charset_defs,"r");
  68.     h= fopener (charset_map,"w");
  69.  
  70.     v[mx++]= '?' * C256 +'?';
  71.     while (fgets ((char *)s,LSIZE,f)) {
  72.         line++;
  73.         if (mx > AMAX) perror ("Warning: too many chars\n");
  74.         if (s[0] != ' ' && strlen (s) > 2) {
  75.             v[mx++]= s[0]* C256 + s[1]; l[mx]= line;
  76.             for (i=0; i < mx-1; i++) if (v[mx-1] == v[i])
  77.                 (void) fprintf (stderr, 
  78.             "Warning: char %2.2s occurs in line %d and %d\n",
  79.             s,l[i+1],line);
  80.             (void) fprintf (h,"%2.2s\t,,,%.3d,,,%.3d,,,%.3d,,,%.3d\t%s",
  81.             s,group,plane,row,cell,s+3);
  82.             cell++;
  83.         }
  84.         else if (strlen (s) >3 ){
  85.             sscanf ((char *)s," %s %d", cmd, &num);
  86.             for (p=cmd; *p; p++) if (isupper (*p)) *p= tolower (*p);
  87.             /* printf ("command %s %d\n",cmd,num); */
  88.             if (strcmp (cmd,"group") == 0) group=num;
  89.             else if (strcmp (cmd,"plane") == 0) plane=num;
  90.             else if (strcmp (cmd,"row") == 0) row=num;
  91.             else if (strcmp (cmd,"cell") == 0) cell=num;
  92.         }
  93.     }
  94.  
  95.     (void) fprintf (stdout,"%d chars defined\n",mx);
  96.     fclose (f); fclose (h);
  97.  
  98.     v[0]= mx;
  99.     g= fopener (charset_mnem,"w");
  100.  
  101.     fwrite (v,2,mx,g);
  102.     v[0]= '?' * C256 +'?';
  103.  
  104.     f= fopener (charset_sets,"r");
  105.  
  106.     if (chdir (charset_dir))
  107.         (void) fprintf (stderr,"Warning: cannot cd to %s\n",charset_dir);
  108.  
  109.     while (fscanf (f,"%s",s) != EOF) {
  110.         if (strlen (s) == 1) { s[1]= ' '; s[2]= '\0'; }
  111.         cv= s[0]* C256 + s[1];
  112.         if (strlen (s) != 2) {
  113.             if (strcmp ((char *)s,"referenceset") == 0) {
  114.                 fgets ((char *)ref+32,40,f); /* skip rest of line */
  115.                 fgets ((char *)ref+32,40,f);
  116.                 fgets ((char *)ref+64,40,f);
  117.                 fgets ((char *)ref+96,40,f);
  118.                 for (i=0; i< 32; i++) ref[i]= 0;
  119.                 for (i=33; i< C256; i++)
  120.                 if (ref[i] <= ref[32]) ref[i]= 0;
  121.                 fwrite (ref,1,C256,g);
  122.                 fclose (g); g= NULL;
  123.             } else if (strcmp ((char *)s,"charset") == 0) {
  124.                 fscanf (f,"%s",defname);
  125.                 gwrite();
  126.                 for (p= defname; *p; p++)
  127.                 if (islower (*p)) *p= toupper (*p);
  128.                 g= fopener (defname,"w");
  129.                 cod= 0; ecma= 0;
  130.                 for (i= 0; i < mx; i++) c[i] = 0;
  131.                 for (i=0; i< C256; i++) codetable[i]= 0;
  132.             } else if (strcmp ((char *)s,"alias") == 0) {
  133.                 fscanf (f,"%s",linkname);
  134.                 for (p= linkname; *p; p++)
  135.                 if (islower (*p)) *p= toupper (*p);
  136.                 unlink (linkname);
  137.                 link (defname,linkname);
  138.             } else if (strcmp ((char *)s,"ecma") == 0) {
  139.                 ecma= fscanf (f,"%s",s);
  140.                 if (s[0] == 'o') sscanf ((char *)s+1,"%o",&ecma);
  141.                 else if (s[0] == 'x') sscanf ((char *)s+1,"%x",&ecma);
  142.                 else sscanf ((char *)s,"%d",&ecma);
  143.             } else if (strcmp ((char *)s,"code") == 0) {
  144.                 cod= fscanf (f,"%s",s);
  145.                 if (s[0] == 'o') sscanf ((char *)s+1,"%o",&cod);
  146.                 else if (s[0] == 'x') sscanf ((char *)s+1,"%x",&cod);
  147.                 else sscanf ((char *)s,"%d",&cod);
  148.             } else if (strcmp ((char *)s,"comment:") == 0) {
  149.                 char c;
  150.                 while ((c = fgetc (f)) != EOF && c != '\n');
  151.             } else if (strcmp ((char *)s,"duplicate") == 0) {
  152.                 dupl= fscanf (f,"%s",s);
  153.                 if (s[0] == 'o') sscanf ((char *)s+1,"%o",&dupl);
  154.                 else if (s[0] == 'x') sscanf ((char *)s+1,"%x",&dupl);
  155.                 else sscanf ((char *)s,"%d",&dupl);
  156.                 if (dupl <0 || dupl >= C256 ||  
  157.                 ! codetable[dupl])
  158.                     (void) fprintf (stderr, "Warning: charset %s has duplicate %d but no original\n",defname,dupl);
  159.                 fscanf (f,"%s",s);
  160.                 if (strlen (s) == 1) { s[1]= ' '; s[2]= '\0'; }
  161.                 cv= s[0]* C256 + s[1];
  162.                 for (i= 0; i < mx && cv != v[i]; i++);
  163.                 if (i >= mx)
  164.                     (void) fprintf (stderr, "Warning: charset %s duplicate %d %s unknown\n",defname,dupl,s);
  165.                 c[i] = dupl;
  166.             } else
  167.                 (void) fprintf (stderr, "Warning: charset %s unknown command '%s'\n",defname,s);
  168.         } else {
  169.             for (i= 0; i < mx && cv != v[i]; i++);
  170.             if (i >= mx)
  171.                 (void) fprintf (stderr, "charset %s char %s %d not defined\n",defname,s,cod++);
  172.             else  {
  173.                 val= i;
  174.                 if (val) for (i=0; i <= cod && codetable[i] != val; i++);
  175.                 if (val && codetable[i] == val)
  176.                     (void) fprintf (stderr, "Warning: charset %s char %s occurs twice %d %d\n",defname,s,i,cod);
  177.                 codetable[cod++]= val;
  178.             }
  179.         }
  180.     }
  181.     fclose (f);
  182.     gwrite();
  183.     exit (0);
  184. }
  185.