home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / dv_x / dvix.zip / FINDFILE.C < prev    next >
C/C++ Source or Header  |  1988-10-18  |  5KB  |  193 lines

  1. /* findfile.c
  2.  * Copyright 1985 Massachusetts Institute of Technology
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <sys/types.h>
  7. #include <sys/dir.h>
  8. #include "findfile.h"
  9.  
  10. int
  11. findfileindir(area, name, mag, s, nname, nmag)
  12.      char *area,*name,*s,*nname;
  13.      int mag,*nmag;
  14. {
  15.   FILE *f;
  16.   char buf[BUFSIZ];
  17.   int found = 0;
  18.     
  19.   sprintf(s,"%s/SUBDIR",area);
  20. #ifdef USEPXL
  21. if (!access(s,0)) sprintf(s,"%s/%s/%s.%dpxl",area,name,name,mag);
  22. else sprintf(s,"%s/%s.%dpxl",area,name,mag);
  23. #else
  24.   if (!access(s,0)) sprintf(s,"%s/%s/%s.%dgf",area,name,name,mag);
  25.   else sprintf(s,"%s/%s.%dgf",area,name,mag);
  26. #endif
  27.   if (!access(s,4)) {
  28.     strcpy(nname,name);
  29.     *nmag = mag;
  30.     return(-1);
  31.   } else {
  32.     sprintf(buf,"%s/NEEDED",area);
  33.     if (!access(buf,2)) {
  34. #ifdef USEPXL
  35.       sprintf(s,"%s.%dpxl\n",name,mag);
  36. #else
  37.       sprintf(s,"%s.%dgf\n",name,mag);
  38. #endif
  39.       f = fopen(buf,"r+");
  40.       while (fgets(buf,sizeof(buf),f)) if (!strcmp(buf,s)) found++;
  41.       if (!found) fputs(s,f);
  42.       fclose(f);
  43.     }
  44.     return(0);
  45.   }
  46. }
  47.  
  48.  
  49. /* true if it found a file, false otherwise; name is in s */
  50. int findfile(dirvec,dirveclen,area, name, mag, s, nname, nmag)
  51.      char *dirvec[],*area,*name,*s,*nname;
  52.      int dirveclen,mag,*nmag;
  53. {
  54.   int i,point;
  55.   char family[128];
  56.  
  57.   strcpy(nname,name);
  58.   *nmag = mag;
  59.   point = -1;
  60.   (void) sscanf(name,"%[^0123456789.]%d",family,&point);
  61.  
  62.   /* First check dir area given in DVI file */
  63.   if (*area && findfileindir(area, name, mag, s, nname, nmag)) return(-1);
  64.   
  65.   /* Then check along dirvec */
  66.   for (i = 0; i < dirveclen; i++) 
  67.     if (findfileindir(dirvec[i], name, mag, s, nname, nmag)) return(-1);
  68.  
  69.   /* next check for closest magnification along dirvec */
  70.   return(findanyfile(dirvec,dirveclen,family,point,mag,name,s,nname,nmag));
  71. }
  72.   
  73. int strdiff(s1,s2)
  74.      char *s1,*s2;
  75. {
  76.   register int diff = 0;
  77.  
  78.   while (*s1 && *s2) diff += abs(*s1++ - *s2++);
  79.   while (*s1) diff += *s1++;
  80.   while (*s2) diff += *s2++;
  81.   return(diff);
  82. }
  83.  
  84. scanpdir(dir,name,
  85.      family,point,mag,
  86.      bestfamily,bestname,bestpoint,bestmag,
  87.      min_df,min_dp,min_dm)
  88.      char *dir,*name,*family,*bestfamily,*bestname;
  89.      int point,mag,*bestpoint,*bestmag,*min_df,*min_dp,*min_dm;
  90. {
  91.   DIR *dirstream;
  92.   struct direct *dirrecord;
  93.   char qfamily[128];
  94.   int qpoint,qmag,df,dp,dm;
  95.  
  96.   if (dirstream = opendir(dir)) {
  97.     while (dirrecord = readdir(dirstream)) {
  98. #ifdef USEPXL
  99.       if (!strcmp(dirrecord->d_name+dirrecord->d_namlen-3,"pxl")) {
  100. #else
  101.       if (!strcmp(dirrecord->d_name+dirrecord->d_namlen-2,"gf")) {
  102. #endif
  103.     qpoint = -1; qmag = -1;
  104.     (void) sscanf(dirrecord->d_name,"%[^0123456789.]%d.%d",
  105.               qfamily,&qpoint,&qmag);
  106.     df = strdiff(family,qfamily);
  107.     dp = abs(point - qpoint);
  108.     dm = abs(mag - qmag);
  109.     if ((df < *min_df)
  110.         || (df == *min_df && dp < *min_dp)
  111.           || (df == *min_df && dp == *min_dp && dm < *min_dm)) {
  112.         sprintf(bestname,"%s/%s",dir,dirrecord->d_name);
  113.         strcpy(bestfamily,qfamily);
  114.         *bestpoint = qpoint;
  115.         *bestmag = qmag;
  116.         *min_df = df;
  117.         *min_dp = dp;
  118.         *min_dm = dm;
  119.       }
  120.       }
  121.     }
  122.     closedir(dirstream);
  123.   }
  124. }
  125.  
  126. scandir(dir,name,
  127.     family,point,mag,
  128.     bestfamily,bestname,bestpoint,bestmag,
  129.     min_df,min_dp,min_dm)
  130.      char *dir,*name,*family,*bestfamily,*bestname;
  131.      int point,mag,*bestpoint,*bestmag,*min_df,*min_dp,*min_dm;
  132. {
  133.   DIR *dirstream;
  134.   struct direct *dirrecord;
  135.   int df;
  136.   char pdir[MAXNAMLEN];
  137.  
  138.   if (dirstream = opendir(dir)) {
  139.     while (dirrecord = readdir(dirstream)) {
  140.       if (dirrecord->d_name[0] != '.') {
  141.     df = strdiff(name,dirrecord->d_name);
  142.     if (df <= *min_df) {
  143.       sprintf(pdir,"%s/%s",dir,dirrecord->d_name);
  144.       scanpdir(pdir,name,
  145.            family,point,mag,
  146.            bestfamily,bestname,bestpoint,bestmag,
  147.            min_df,min_dp,min_dm);
  148.     }
  149.       }
  150.     }
  151.     closedir(dirstream);
  152.   }
  153. }
  154.  
  155.  
  156. /* finds the best match to the desired font */
  157. int findanyfile(dirvec,dirveclen,family,point,mag,name,s,nname,nmag)
  158.      char *dirvec[],*family,*name,*s,*nname;
  159.      int dirveclen,point,mag,*nmag;
  160. {
  161.   char foo[MAXNAMLEN],bestname[MAXNAMLEN],bestfamily[128];
  162.   int min_df,min_dp,min_dm,df,dp,dm,i,bestpoint,bestmag;
  163.   
  164.   bestname[0] = '\0'; 
  165.   min_df = min_dp = min_dm = 9999999;
  166.   for (i = 0; i < dirveclen; i++) {
  167.     sprintf(foo,"%s/SUBDIR",dirvec[i]);
  168.     if (!access(foo,0)) scandir(dirvec[i],name,
  169.                 family,point,mag,
  170.                 bestfamily,bestname,&bestpoint,&bestmag,
  171.                 &min_df,&min_dp,&min_dm);
  172.     else scanpdir(dirvec[i],name,
  173.           family,point,mag,
  174.           bestfamily,bestname,&bestpoint,&bestmag,
  175.           &min_df,&min_dp,&min_dm);
  176.   }
  177.   if (bestname[0]) {
  178.     if (bestpoint > 0) sprintf(nname,"%s%d",bestfamily,bestpoint);
  179.     else strcpy(nname,bestfamily);
  180.     *nmag = bestmag;
  181.     strcpy(s,bestname);
  182.     if ((strcmp(bestfamily,family)
  183.      || bestpoint != point || abs(bestmag - mag) > 2)) 
  184.       fprintf(stderr,
  185.           "Substituted font %s at mag %d for %s at mag %d.\n",
  186.           nname,(bestmag * 4 + 3) / 6,
  187.           name,(mag * 4 + 3) / 6);
  188.     return(-1);
  189.   }
  190.   return(0);
  191. }
  192.   
  193.