home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / sendmail / sendmail-5.65c+IDA-1.4.4.1 / ida / charset / gc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-04  |  4.4 KB  |  168 lines

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