home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / maths / plplot / plplot_2 / fonts / stndfont.c < prev    next >
C/C++ Source or Header  |  1994-08-25  |  3KB  |  142 lines

  1. /* $Id: stndfont.c,v 1.8 1994/08/25 04:02:57 mjl Exp $
  2.  * $Log: stndfont.c,v $
  3.  * Revision 1.8  1994/08/25  04:02:57  mjl
  4.  * Cleaned up header file inclusion.
  5.  *
  6. */
  7.  
  8. /*    stndfont.c
  9.  
  10.     Utility to generate standard font set.
  11. */
  12.  
  13. #include "plplotP.h"
  14.  
  15. extern short int *hersh[];
  16. extern short int *findex[];
  17. extern short int *buffer[];
  18.  
  19. int 
  20. compare (const void *si1, const void *si2)
  21. {
  22.     short *a = (short *) si1;
  23.     short *b = (short *) si2;
  24.     
  25.     return (*a == *b ? 0 : ( *a > *b ? 1 : -1));
  26. }
  27.  
  28. int 
  29. main (int argc, char **argv)
  30. {
  31.     short i, j, k, ib, nstd, nchars, nleng, htab, nindx, zero;
  32.     short *hrshlst, *hrshidx;
  33.     SCHAR ix, iy;
  34.     long fpos;
  35.     PDFstrm *pdfs;
  36.  
  37.     hrshlst = (short *) malloc(176 * sizeof(short));
  38.     hrshidx = (short *) malloc(176 * sizeof(short));
  39.  
  40.     ib = 0;
  41.     for (k = 0; k < 176; k++)
  42.     hrshlst[ib++] = *(hersh[0] + k);
  43.  
  44.     /* Sort list */
  45.     qsort((char *) hrshlst, ib, sizeof(short), compare);
  46.  
  47.     /* Remove duplicates */
  48.     k = 0;
  49.     j = 0;
  50.     do {
  51.     if (hrshlst[k] == hrshlst[j])
  52.         j++;
  53.     else
  54.         hrshlst[++k] = hrshlst[j];
  55.     } while (j < ib);
  56.  
  57.     nstd = k + 1;
  58.     /* Now reindex the fonts */
  59.     for (k = 0; k < 176; k++)
  60.     for (i = 0; i < nstd; i++)
  61.         if (*(hersh[0] + k) == hrshlst[i]) {
  62.         hrshidx[k] = i + 1;
  63.         break;
  64.         }
  65.  
  66.     pdfs = pdf_fopen(PL_SFONT, "wb+");
  67.     if ( ! pdfs) {
  68.     printf("Error opening standard font file.\n");
  69.     exit(1);
  70.     }
  71.  
  72.     htab = 1 * 256 + 176;
  73.     pdf_wr_2bytes(pdfs, htab);
  74.     pdf_wr_2nbytes(pdfs, (U_SHORT *) hrshidx, 176);
  75.  
  76.     zero = 0;
  77.     nindx = 0;
  78.     nleng = 1;
  79.     fpos = ftell(pdfs->file);
  80.  
  81.     pdf_wr_2bytes(pdfs, nindx);
  82.     for (j = 0; j < nstd; j++) {
  83.     ib = *(findex[(hrshlst[j] - 1) / 100] + (hrshlst[j] - 1) % 100);
  84.     if (ib == 0) {
  85.         pdf_wr_2bytes(pdfs, zero);
  86.         nindx++;
  87.     }
  88.     else {
  89.         pdf_wr_2bytes(pdfs, nleng);
  90.         nindx++;
  91.         for (;;) {
  92.         ix = *(buffer[ib / 100] + ib % 100) / 128 - 64;
  93.         iy = *(buffer[ib / 100] + ib % 100) % 128 - 64;
  94.         ib++;
  95.         if (ix == -64)
  96.             ix = 64;
  97.         if (iy == -64)
  98.             iy = 64;
  99.         nleng++;
  100.         if (ix == 64 && iy == 64)
  101.             break;
  102.         }
  103.     }
  104.     }
  105.     fseek(pdfs->file, fpos, 0);
  106.     pdf_wr_2bytes(pdfs, nindx);
  107.  
  108.     nchars = 0;
  109.     nleng = 1;
  110.     fseek(pdfs->file, 0, 2);        /* Go to end of file */
  111.     fpos = ftell(pdfs->file);        /* Save current position */
  112.     pdf_wr_2bytes(pdfs, nleng);
  113.  
  114.     for (j = 0; j < nstd; j++) {
  115.     ib = *(findex[(hrshlst[j] - 1) / 100] + (hrshlst[j] - 1) % 100);
  116.     if (ib != 0) {
  117.         for (;;) {
  118.         ix = *(buffer[ib / 100] + ib % 100) / 128 - 64;
  119.         iy = *(buffer[ib / 100] + ib % 100) % 128 - 64;
  120.         ib++;
  121.         if (ix == -64)
  122.             ix = 64;
  123.         if (iy == -64)
  124.             iy = 64;
  125.         fputc(ix, pdfs->file);
  126.         fputc(iy, pdfs->file);
  127.         nleng++;
  128.         if (ix == 64 && iy == 64)
  129.             break;
  130.         }
  131.         nchars++;
  132.     }
  133.     }
  134.     nleng--;
  135.     fseek(pdfs->file, fpos, 0);
  136.     pdf_wr_2bytes(pdfs, nleng);
  137.     pdf_close(pdfs);
  138.  
  139.     printf("There are %d characters in standard font set.\n", nchars - 1);
  140.     exit(0);
  141. }
  142.