home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / d / dvips551.zip / DVIPS.ZIP / SEARCH.C < prev    next >
C/C++ Source or Header  |  1993-02-11  |  10KB  |  338 lines

  1. /*
  2.  *   The search routine takes a directory list, separated by PATHSEP, and
  3.  *   tries to open a file.  Null directory components indicate current
  4.  *   directory. if the file SUBDIR exists and the file is a font file,
  5.  *   it checks for the file in a subdirectory named the same as the font name.
  6.  *   Returns the open file descriptor if ok, else NULL.
  7.  */
  8. #include "dvips.h" /* The copyright notice in that file is included too! */
  9. #include <ctype.h>
  10.  
  11. #if defined(SYSV) || defined(VMS) || defined(__THINK__) || defined(MSDOS)
  12. #define MAXPATHLEN (256)
  13. #else
  14. #include <sys/param.h>          /* for MAXPATHLEN */
  15. #endif
  16. #ifndef MSDOS
  17. #ifndef VMS
  18. #ifndef MVSXA
  19. #ifndef VMCMS /* IBM: VM/CMS */
  20. #ifndef __THINK__
  21. #include <pwd.h>
  22. #endif
  23. #endif
  24. #endif  /* IBM: VM/CMS */
  25. #endif
  26. #endif
  27. /*
  28.  *
  29.  *   We hope MAXPATHLEN is enough -- only rudimentary checking is done!
  30.  */
  31.  
  32. #ifdef DEBUG
  33. extern integer debug_flag;
  34. #endif  /* DEBUG */
  35. extern char *mfmode ;
  36. extern int actualdpi ;
  37. char realnameoffile[MAXPATHLEN] ;
  38. FILE *
  39. search(path, file, mode)
  40.         char *path, *file, *mode ;
  41. {
  42.    extern char *getenv(), *newstring() ;
  43.    register char *nam ;                 /* index into fname */
  44.    register FILE *fd ;                  /* file desc of file */
  45.    char fname[MAXPATHLEN] ;             /* to store file name */
  46.    static char *home = 0 ;              /* home is where the heart is */
  47. #ifdef VMCMS /* IBM: VM/CMS - we don't have paths or dirsep's but we strip off
  48.                              filename if there is a Unix path dirsep    */
  49.    register char *lastdirsep ;
  50.    lastdirsep = strrchr(file, '/') ;
  51.    if ( NULL != lastdirsep ) file = lastdirsep + 1 ;
  52.    if ((fd=fopen(file,mode)) != NULL) {
  53.       return(fd) ;
  54.    } else {
  55.       return(NULL) ;
  56.    }
  57. #else
  58.    if (*file == DIRSEP) {               /* if full path name */
  59.       if ((fd=fopen(file,mode)) != NULL) {
  60.          strcpy(realnameoffile, file) ;
  61.          return(fd) ;
  62.       } else
  63.          return(NULL) ;
  64.    }
  65. #endif   /* IBM: VM/CMS */
  66.  
  67. #ifdef MSDOS
  68.    if ( isalpha(file[0]) && file[1]==':' ) {   /* if full path name */
  69.       if ((fd=fopen(file,mode)) != NULL)
  70.          return(fd) ;
  71.       else
  72.          return(NULL) ;
  73.    }
  74. #endif
  75.  
  76.    do {
  77.       /* copy the current directory into fname */
  78.       nam = fname;
  79.       /* copy till PATHSEP */
  80.       if (*path == '~') {
  81.          char *p = nam ;
  82.          path++ ;
  83.          while (*path && *path != PATHSEP && *path != DIRSEP)
  84.             *p++ = *path++ ;
  85.          *p = 0 ;
  86.          if (*nam == 0) {
  87.             if (home == 0) {
  88.                if (0 != (home = getenv("HOME")))
  89.                   home = newstring(home) ;
  90.                else
  91.                   home = "." ;
  92.             }
  93.             strcpy(fname, home) ;
  94.          } else {
  95. #ifdef MSDOS
  96.             error("! ~username in path???") ;
  97. #else
  98. #ifdef VMS
  99.             error("! ~username in path???") ;
  100. #else
  101. #ifdef VMCMS  /* IBM: VM/CMS */
  102.             error("! ~username in path???") ;
  103. #else
  104. #ifdef MVSXA  /* IBM: MVS/XA */
  105.             error("! ~username in path???") ;
  106. #else
  107. #ifdef __THINK__
  108.             error("! ~username in path???") ;
  109. #else
  110.             struct passwd *pw = getpwnam(fname) ;
  111.             if (pw)
  112.                strcpy(fname, pw->pw_dir) ;
  113.             else
  114.                error("no such user") ;
  115. #endif
  116. #endif  /* IBM: VM/CMS */
  117. #endif
  118. #endif
  119. #endif
  120.          }
  121.          nam = fname + strlen(fname) ;
  122.       }
  123.       while (*path != PATHSEP && *path) *nam++ = *path++;
  124.       *nam = 0 ;
  125. #ifndef VMS
  126. #ifndef __THINK__
  127.       if (nam == fname) *nam++ = '.';   /* null component is current dir */
  128.  
  129.       if (*file != '\0') {
  130.          if ((nam != fname) && *(nam-1) != DIRSEP) /* GNW 1992.07.09 */
  131.             *nam++ = DIRSEP;                  /* add separator */
  132.          (void)strcpy(nam,file);                   /* tack the file on */
  133.       }
  134.       else
  135.          *nam = '\0' ;
  136. #else
  137.       (void)strcpy(nam,file);                   /* tack the file on */
  138. #endif
  139. #else
  140.       (void)strcpy(nam,file);                   /* tack the file on */
  141. #endif
  142. #ifdef MVSXA
  143.       if (fname[0] == '/') {
  144.          fname[0] = '\'';
  145.          strcat(&fname[strlen(fname)],"\'");
  146.       }
  147.       if (fname[0] == '.') fname[0] = ' ';
  148.       if (fname[1] == '.') fname[1] = ' ';
  149. #endif
  150.  
  151.       /* belated check -- bah! */
  152.       if ((nam - fname) + strlen(file) + 1 > MAXPATHLEN)
  153.          error("! overran allocated storage in search()");
  154.  
  155. #ifdef DEBUG
  156.       if (dd(D_PATHS))
  157.          (void)fprintf(stderr,"Trying to open %s\n", fname) ;
  158. #endif
  159.       if ((fd=fopen(fname,mode)) != NULL) {
  160.          strcpy(realnameoffile, fname) ;
  161.          return(fd);
  162.       }
  163.  
  164.    /* skip over PATHSEP and try again */
  165.    } while (*(path++));
  166.  
  167.    return(NULL);
  168.  
  169. }               /* end search */
  170.  
  171. FILE *
  172. pksearch(path, file, mode, n, dpi, vdpi)
  173.         char *path, *file, *mode ;
  174.     char *n ;
  175.     halfword dpi, vdpi ;
  176. {
  177.    extern char *getenv(), *newstring() ;
  178.    register char *nam ;                 /* index into fname */
  179.    register FILE *fd ;                  /* file desc of file */
  180.    char fname[MAXPATHLEN] ;             /* to store file name */
  181.    static char *home = 0 ;              /* home is where the heart is */
  182.    int sub ;
  183.  
  184.    if (*file == DIRSEP) {               /* if full path name */
  185.       if ((fd=fopen(file,mode)) != NULL)
  186.          return(fd) ;
  187.       else
  188.          return(NULL) ;
  189.    }
  190. #ifdef MSDOS
  191.    if ( isalpha(file[0]) && file[1]==':' ) {  /* if full path name */
  192.       if ((fd=fopen(file,mode)) != NULL)
  193.          return(fd) ;
  194.       else
  195.          return(NULL) ;
  196.    }
  197. #endif
  198.    do {
  199.       /* copy the current directory into fname */
  200.       nam = fname;
  201.       sub = 0 ;
  202.       /* copy till PATHSEP */
  203.       if (*path == '~') {
  204.          char *p = nam ;
  205.          path++ ;
  206.          while (*path && *path != PATHSEP && *path != DIRSEP)
  207.             *p++ = *path++ ;
  208.          *p = 0 ;
  209.          if (*nam == 0) {
  210.             if (home == 0) {
  211.                if (0 != (home = getenv("HOME")))
  212.                   home = newstring(home) ;
  213.                else
  214.                   home = "." ;
  215.             }
  216.             strcpy(fname, home) ;
  217.          } else {
  218. #ifdef MSDOS
  219.             error("! ~username in path???") ;
  220. #else
  221. #ifdef VMS
  222.             error("! ~username in path???") ;
  223. #else
  224. #ifdef VMCMS  /* IBM: VM/CMS */
  225.             error("! ~username in path???") ;
  226. #else
  227. #ifdef MVSXA  /* IBM: MVS/XA */
  228.             error("! ~username in path???") ;
  229. #else
  230. #ifdef __THINK__
  231.             error("! ~username in path???") ;
  232. #else
  233.             struct passwd *pw = getpwnam(fname) ;
  234.             if (pw)
  235.                strcpy(fname, pw->pw_dir) ;
  236.             else
  237.                error("no such user") ;
  238. #endif
  239. #endif /* IBM: VM/CMS */
  240. #endif
  241. #endif
  242. #endif
  243.          }
  244.          nam = fname + strlen(fname) ;
  245.       }
  246.       /* copy till PATHSEP */
  247.       while (*path != PATHSEP && *path) {
  248.          if (*path == '%') {
  249.             sub = 1 ;
  250.             path++ ;
  251.             switch(*path) {
  252.                case 'b': sprintf(nam, "%d", actualdpi) ; break ;
  253.                case 'd': sprintf(nam, "%d", dpi) ; break ;
  254.                case 'f': strcpy(nam, n) ; break ;
  255.                case 'm': if (mfmode == 0)
  256.                             if (actualdpi == 300) mfmode = "imagen" ;
  257.                             else if (actualdpi == 400) mfmode = "nexthi" ;
  258.                             else if (actualdpi == 635) mfmode = "linolo" ;
  259.                             else if (actualdpi == 1270) mfmode = "linohi" ;
  260.                             else if (actualdpi == 2540) mfmode = "linosuper" ;
  261.                          if (mfmode == 0)
  262.                             error("! MF mode not set, but used in pk path") ;
  263.                          strcpy(nam, mfmode) ;
  264.                          break ;
  265.                case 'p': strcpy(nam, "pk") ; break ;
  266.                case '%': strcpy(nam, "%") ; break ;
  267.                default: error("! bad format character in pk path") ;
  268.             }
  269.             nam = fname + strlen(fname) ;
  270.             if (*path)
  271.                path++ ;
  272.          } else
  273.             *nam++ = *path++;
  274.       }
  275. #ifndef VMS
  276. #ifndef __THINK__
  277.       if (nam == fname) *nam++ = '.';   /* null component is current dir */
  278. #endif
  279. #endif /* VMS */
  280.       if (sub == 0 && *file) {
  281.          if ((nam != fname) && *(nam-1) != DIRSEP) /* GNW 1992.07.09 */
  282.             *nam++ = DIRSEP ;
  283.          strcpy(nam, file) ;
  284.       } else
  285.          *nam = 0 ;
  286.  
  287. #ifdef MVSXA   /* IBM: MVS/XA */
  288.       if (fname[0] == '/') {
  289.          fname[0] = '\'';
  290.          strcat(&fname[strlen(fname)],"\'");
  291.       }
  292.       if (fname[0] == '.') fname[0] = ' ';
  293.       if (fname[1] == '.') fname[1] = ' ';
  294. #endif         /* IBM: MVS/XA */
  295.       /* belated check -- bah! */
  296.       if (strlen(fname) + 1 > MAXPATHLEN)
  297.          error("! overran allocated storage in search()");
  298.  
  299. #ifdef DEBUG
  300.       if (dd(D_PATHS))
  301.          (void)fprintf(stderr,"Trying to open %s\n", fname) ;
  302. #endif
  303.       if ((fd=fopen(fname,mode)) != NULL)
  304.          return(fd);
  305.  
  306.    /* skip over PATHSEP and try again */
  307.    } while (*(path++));
  308.  
  309.    return(NULL);
  310.  
  311. }               /* end search */
  312.  
  313. /* do we report file openings? */
  314.  
  315. #ifdef DEBUG
  316. #  ifdef fopen
  317. #    undef fopen
  318. #  endif
  319. #  ifdef VMCMS  /* IBM: VM/CMS */
  320. #    define fopen cmsfopen
  321. #  endif /* IBM: VM/CMS */
  322. FILE *my_real_fopen(n, t)
  323. register char *n, *t ;
  324. {
  325.    FILE *tf ;
  326.    if (dd(D_FILES)) {
  327.       fprintf(stderr, "<%s(%s)> ", n, t) ;
  328.       tf = fopen(n, t) ;
  329.       if (tf == 0)
  330.          fprintf(stderr, "failed\n") ;
  331.       else
  332.          fprintf(stderr, "succeeded\n") ;
  333.    } else
  334.       tf = fopen(n, t) ;
  335.    return tf ;
  336. }
  337. #endif
  338.