summaryrefslogtreecommitdiff
path: root/obsolete/dviware/dvi2xx/findfile.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /obsolete/dviware/dvi2xx/findfile.c
Initial commit
Diffstat (limited to 'obsolete/dviware/dvi2xx/findfile.c')
-rw-r--r--obsolete/dviware/dvi2xx/findfile.c324
1 files changed, 324 insertions, 0 deletions
diff --git a/obsolete/dviware/dvi2xx/findfile.c b/obsolete/dviware/dvi2xx/findfile.c
new file mode 100644
index 0000000000..baec7db75d
--- /dev/null
+++ b/obsolete/dviware/dvi2xx/findfile.c
@@ -0,0 +1,324 @@
+#include "config.h"
+#include <string.h>
+#include <stdio.h>
+#ifndef vms
+#include <sys/types.h>
+#include <sys/stat.h>
+#else
+#include <types.h>
+#include <stat.h>
+#endif
+
+int stat();
+
+char *path_segment();
+char *pprint();
+extern void Warning();
+extern bool G_quiet;
+extern int Debug;
+
+#ifdef MAKETEXPK
+extern bool makeTexPK ;
+#endif
+
+#ifdef unix
+#ifdef DO_SUBDIRECTORIES
+#include <glob.h>
+#endif
+#endif
+
+#ifdef unix
+ static char* raster_table[] = {
+#ifdef USEPXL
+ "%P/%N.%Rpk",
+ "%P/%N.%Rpxl",
+ "%P/dpi%R/%N.pk",
+ "%P/%R/%N.pxl",
+ "%P/dpi%R/%N.pxl",
+ "%P/pxl%M/%N.pk",
+ "%P/pxl%M/%N.pxl",
+ "%P/%N.%R",
+#else
+ "%P/%N.%Rgf",
+ "%P/%N.%Mgf",
+#endif
+ NULL
+ };
+#endif
+
+#ifdef vms
+ static char* raster_table[] = {
+#ifdef USEPXL
+ "%P[%R]%N.pk;",
+ "%P%N.%Rpk;",
+ "%P:[%R]%N.pk;",
+ "%P:%N.%Rpk;",
+ "%P[%R]%N.pk;",
+ "%P%N.%Mpxl;",
+ "%P:[%M]%N.pxl;",
+ "%P:%N.%Mpxl;",
+#else
+ "%P%N.%Rgf;",
+ "%P:%N.%Rgf;",
+ "%P%N.%Mgf;",
+ "%P:%N.%Mgf;",
+#endif
+ NULL
+ };
+#endif
+
+#ifdef MSDOS
+ static char* raster_table[] = {
+#ifdef USEPXL
+ "%P/dpi%R/%N.pk",
+ "%P/%R/%N.pk",
+ "%P/dpi%R/%N.pxl",
+ "%P/%R/%N.pxl",
+ "%P/pxl%M/%N.pk",
+ "%P/pxl%M/%N.pxl",
+ "%P/%N.%R",
+#else
+ "%P/%R/%N.gf",
+ "%P/dpi%R/%N.gf",
+ "%P/pxl%M/%N.gf",
+#endif
+ NULL
+ };
+#endif
+
+#ifdef _AMIGA
+ static char* raster_table[] = {
+#ifdef USEPXL
+ "%P/%N.%Rpk",
+ "%P/%N.%Rpxl",
+ "%P/dpi%R/%N.pk",
+ "%P/%R/%N.pxl",
+ "%P/dpi%R/%N.pxl",
+ "%P/pxl%M/%N.pk",
+ "%P/pxl%M/%N.pxl",
+ "%P/%R/%N.%Rpk",
+ "%P/%N.%R",
+#else
+ "%P/%N.%Rgf",
+ "%P/%N.%Mgf",
+#endif
+ NULL
+ };
+#endif
+
+
+
+
+bool
+findfile(path,n,fontmag,name,tfm,level)
+char path[STRSIZE]; /* PIXEL path */
+char n[STRSIZE]; /* name of font */
+long fontmag; /* magnification */
+char name[STRSIZE]; /* full name of PXL file (returned) */
+bool tfm; /* are we searching for a tfm file? */
+int level; /* recursion level to prevent calling of MakeTeXPK */
+{
+ char local_path[STRSIZE];
+#ifdef MAKETEXPK
+ char MakePKCommand[STRSIZE];
+#endif
+ char *pathpt;
+ struct stat s;
+ int resolution, i;
+ char **pattern;
+
+ if (tfm) {
+ resolution = 0; /* dont'care */
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr,
+ "locating tfm %s, path %s, depth=%d\n",
+ n, path, level);
+#endif
+ } else {
+ resolution = (int)(fontmag/5.0 + 0.5);
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr,
+ "locating raster %s, resolution %d on path %s, depth=%d\n",
+ n, resolution, path, level);
+#endif
+ }
+
+
+#ifndef vms
+ for( i=0; (pathpt = path_segment(i, path, local_path)) != NULL; i++) {
+ if (tfm) {
+ if (!stat( pprint(name,"%P/%N.tfm",pathpt,n,resolution,fontmag), &s))
+ return(TRUE);
+ } else {
+ for (pattern = raster_table; *pattern; pattern++) {
+ if (!stat( pprint(name,*pattern,pathpt,n,resolution,fontmag), &s))
+ return(TRUE);
+ }
+ }
+ }
+#else
+ if (tfm) {
+ if ( !stat(pprint(name,"%P/%N.tfm",pathpt,n,resolution,fontmag), &s))
+ return(TRUE);
+ } else {
+ for (pattern = raster_table; *pattern; pattern++) {
+ if (!stat( pprint(name,*pattern,path,n,resolution,fontmag), &s))
+ return(TRUE);
+ }
+ }
+#endif
+
+#ifdef FUTURE
+ for(i=0; (pathpt=path_segment((bool)(i==0),VFPATH,local_path))!=NULL;i++) {
+ sprintf(name,"%s/%s.vfm",pathpt,n);
+ printf("searching virtual font <%s>\n",name);
+ if (stat(name,&s) == 0) return(TRUE);
+ }
+#endif
+
+#ifdef DO_SUBDIRECTORIES
+ if (level < MAX_SUBDIR_SEARCH_DEPTH) {
+ for( i=0; (pathpt = path_segment(i, path, local_path)) != NULL; i++) {
+ glob_t globbuf;
+ char glob_path[STRSIZE + 3];
+ int i;
+ sprintf( glob_path, "%s/*", pathpt );
+ if (glob( glob_path, 0, NULL, &globbuf ) == 0) {
+ for (i = 0; i < globbuf.gl_pathc; i++) {
+ if ((stat( globbuf.gl_pathv[i], &s) == 0) && S_ISDIR(s.st_mode)) {
+ if (findfile(globbuf.gl_pathv[i],
+ n,
+ fontmag,
+ name,
+ tfm,
+ level+1 ) == TRUE) {
+ globfree( &globbuf );
+ return(TRUE);
+ }
+ }
+ }
+ globfree( &globbuf );
+ }
+ }
+ } else {
+ Warning("maximal searchdepth (%d) exceeded, path=%s",
+ MAX_SUBDIR_SEARCH_DEPTH, path);
+ }
+#endif
+
+#ifdef MAKETEXPK
+ if (makeTexPK && level == 0 && !tfm) {
+ sprintf(MakePKCommand,"%s %s %d %d %.4f %s",MAKETEXPK,
+ n,resolution,RESOLUTION,
+ (float)((float)resolution/RESOLUTION),MFMODE);
+ if (!G_quiet)
+ fprintf(stderr,"calling: %s\n",MakePKCommand);
+ system(MakePKCommand);
+ if (findfile(path,n,fontmag,name,tfm,1))
+ return(TRUE);
+ }
+#endif
+
+ if (level == 0) {
+ /* return error message */
+ if (tfm) {
+ sprintf(name, "tfm file not found: path=%s, name=%s", path,n);
+ } else {
+ sprintf(name,
+#ifdef USEPXL
+ "pk or pxl font not found: path=%s, name=%s, resolution=%d, magn=%ld",
+#else
+ "gf font not found: path=%s, name=%s, resolution=%d, magn=%ld",
+#endif
+ path,n,resolution,fontmag);
+ }
+ }
+ return(FALSE);
+}
+
+
+char *
+pprint (buffer, input, path, name, resolution, fontmag)
+char *buffer;
+char *input;
+char *path;
+char *name;
+int resolution;
+long fontmag;
+{
+ char *output = buffer;
+
+ /* fprintf(stderr, "pprint called with <%s>\n", input);*/
+ for (; *input != '\0'; input++)
+ {
+ if (*input == '%') {
+ switch (*(++input))
+ {
+ case 'P':
+ strcpy(output, path);
+ output += strlen(output);
+ break;
+
+ case 'N':
+ strcpy(output, name);
+ output += strlen(output);
+ break;
+
+ case 'R':
+ sprintf(output, "%d", resolution);
+ output += strlen(output);
+ break;
+
+ case 'M':
+#ifdef vms
+ sprintf(output, "%d", fontmag);
+#else
+ sprintf(output, "%ld", fontmag);
+#endif
+ output += strlen(output);
+ break;
+
+ default:
+ *output++ = '%';
+ *output++ = *input;
+ break;
+ }
+ } else {
+ *output++ = *input;
+ }
+ }
+ *output = '\0';
+ /* fprintf(stderr, "pprint returns <%s>\n", buffer); */
+ return buffer;
+}
+
+
+char *
+path_segment(index,full_path,local_path)
+int index;
+char *full_path, *local_path;
+{
+ static char *pppt;
+ char *pathpt;
+
+ if (index == 0) pathpt = strcpy(local_path,full_path);
+ else pathpt = pppt;
+ if (pathpt != NULL) {
+#ifdef unix
+ pppt = strchr(pathpt , ':' );
+#else
+ pppt = strchr(pathpt , ';' );
+#endif
+ if (pppt != NULL) {
+ *pppt = '\0';
+ pppt++;
+ }
+ }
+ return pathpt;
+}
+
+
+
+