ftp.nice.ch/pub/next/unix/developer/plplot.3.0.s.tar.gz#/plplot/fonts/stndfont.c

This is stndfont.c in view mode; [Download] [Up]

#include <stdio.h>
#include <string.h>

extern short int *hersh[];
extern short int *findex[];
extern short int *buffer[];

#if defined(vax) || defined(vax3200)
#define	SCHAR	char
#else
#define	SCHAR	signed char
#endif

int compare(si1, si2)
char *si1, *si2;
{
   return( *(short *)si1 == *(short *)si2 ? 0 : (*(short *)si1 > *(short *)si2 ? 1 : -1));
}

int main()
{
   short i, j, k, ib, nstd, nchars, nleng, htab, nindx, zero;
   short *hrshlst, *hrshidx;
   SCHAR ix, iy;
   long fpos;
   FILE *fontfile;
   char *malloc();
   void qsort();
   long ftell();

   hrshlst = (short *)malloc(176*sizeof(short));
   hrshidx = (short *)malloc(176*sizeof(short));

   ib = 0;
   for(k=0; k<176; k++)
      hrshlst[ib++] = *(hersh[0]+k);

   /* Sort list */
   qsort((char *)hrshlst,ib,sizeof(short),compare);

   /* Remove duplicates */
   k = 0; j = 0;
   do {
      if(hrshlst[k] == hrshlst[j])
         j++;
      else
         hrshlst[++k] = hrshlst[j];
   } while(j < ib);

   nstd = k+1;
   /* Now reindex the fonts */
   for(k=0; k<176; k++)
      for(i=0; i<nstd; i++)
         if(*(hersh[0]+k) == hrshlst[i]) {
            hrshidx[k] = i+1;
            break;
         }

   fontfile = fopen("plstnd.font","w+");
   if(!fontfile) {
      printf("Error opening standard font file.\n");
      exit(1);
   }

   htab = 1*256+176;   /* # of fonts in upper byte # of chars in lower */
   fwrite((char *)&htab,sizeof(short),1,fontfile);
   fwrite((char *)hrshidx,sizeof(short),176,fontfile);

   zero = 0;
   nindx = 0;
   nleng = 1;
   fpos = ftell(fontfile);
   fwrite((char *)&nindx,sizeof(short),1,fontfile);
   for(j=0; j<nstd; j++) {
      ib = *(findex[(hrshlst[j]-1)/100]+(hrshlst[j]-1)%100);
      if(ib == 0) {
         fwrite((char *)&zero,sizeof(short),1,fontfile);
         nindx++;
      }
      else {
         fwrite((char *)&nleng,sizeof(short),1,fontfile);
         nindx++;
         for(;;) {
            ix = *(buffer[ib/100]+ib%100)/128 - 64;
            iy = *(buffer[ib/100]+ib%100)%128 - 64;
            ib++;
            if(ix == -64)
               ix = 64;
            if(iy == -64)
               iy = 64;
            nleng++;
            if(ix == 64 && iy == 64)
               break;
         }
      }
   }
   fseek(fontfile,fpos,0);
   fwrite((char *)&nindx,sizeof(short),1,fontfile);

   nchars = 0;
   nleng = 1;
   fseek(fontfile,0,2);   /* Go to end of file */
   fpos = ftell(fontfile); /* Save current position */
   fwrite((char *)&nleng,sizeof(short),1,fontfile);
   for(j=0; j<nstd; j++) {
      ib = *(findex[(hrshlst[j]-1)/100]+(hrshlst[j]-1)%100);
      if(ib != 0) {
         for(;;) {
            ix = *(buffer[ib/100]+ib%100)/128 - 64;
            iy = *(buffer[ib/100]+ib%100)%128 - 64;
            ib++;
            if(ix == -64)
               ix = 64;
            if(iy == -64)
               iy = 64;
            fputc(ix,fontfile);
            fputc(iy,fontfile);
            nleng++;
            if(ix == 64 && iy == 64)
               break;
         }
         nchars++;
      }
   }
   nleng--;
   fseek(fontfile,fpos,0);
   fwrite((char *)&nleng,sizeof(short),1,fontfile);
   fclose(fontfile);
   printf("There are %d characters in standard font set.\n",nchars-1);
   exit(0);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.