summaryrefslogtreecommitdiff
path: root/dviware/crudetype/version3/unixext.c
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/crudetype/version3/unixext.c')
-rw-r--r--dviware/crudetype/version3/unixext.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/dviware/crudetype/version3/unixext.c b/dviware/crudetype/version3/unixext.c
new file mode 100644
index 0000000000..7a97d9edbe
--- /dev/null
+++ b/dviware/crudetype/version3/unixext.c
@@ -0,0 +1,132 @@
+/* External procedures for unix crudetype */
+/* Written by RMD (nearly all copied from H.Trickey's dvityext.c ) */
+/* Ought to be rewritten in cleaner form... */
+
+#include <stdio.h>
+#include "site.h"
+ /*Only needed to define TEXFONTS */
+
+#define TRUE 1
+#define FALSE 0
+
+char *fontpath;
+extern char *getenv();
+
+/*
+ * setpaths is called to set up the pointer fontpath
+ * as follows: if the user's environment has a value for TEXFONTS
+ * then use it; otherwise, use defaultfontpath.
+ */
+setpaths()
+{
+ register char *envpath;
+
+ if ((envpath = getenv("TEXFONTS")) != NULL)
+ fontpath = envpath;
+ else
+ fontpath = TEXFONTS;
+}
+
+#define namelength 100 /* should agree with crudetype
+
+
+/*
+ * testaccess(amode,filepath, name, realname)
+ *
+ * Test whether or not the file whose name is in name
+ * can be opened for reading (if mode=READACCESS)
+ * or writing (if mode=WRITEACCESS).
+ *
+ * The filepath argument is one of the ...FILEPATH constants defined below.
+ * If the filename given in name does not begin with '/', we try
+ * prepending all the ':'-separated areanames in the appropriate path to the
+ * filename until access can be made, if it ever can.
+ *
+ * The realname global array will contain the name that yielded an
+ * access success.
+ */
+
+#define READACCESS 4
+#define WRITEACCESS 2
+
+#define NOFILEPATH 0
+#define FONTFILEPATH 3
+
+testaccess(amode,filepath,name,realname)
+int amode,filepath;
+char *name;
+char *realname;
+{
+ register boolean ok;
+ register char *p;
+ char *curpathplace;
+ int f;
+
+ switch(filepath) {
+ case NOFILEPATH: curpathplace = NULL; break;
+ case FONTFILEPATH: curpathplace = fontpath; break;
+ }
+ if (name[0]=='/') /* file name has absolute path */
+ curpathplace = NULL;
+ do {
+ packrealname(&curpathplace,name,realname);
+ if (amode==READACCESS)
+ /* use system call "access" to see if we could read it */
+ if (access(realname,READACCESS)==0) ok = TRUE;
+ else ok = FALSE;
+ else {
+ /* WRITEACCESS: use creat to see if we could create it, but close
+ the file again if we're OK, to let pc open it for real */
+ f = creat(realname,0666);
+ ok = (f >= 0);
+ if (ok)
+ (void) close(f);
+ }
+ } while (!ok && curpathplace != NULL);
+ if (ok) { /* pad realname with blanks, as Pascal wants */
+ for (p = realname; *p != '\0'; p++)
+ /* nothing: find end of string */ ;
+ while (p < &(realname[namelength]))
+ *p++ = ' ';
+ }
+ return (ok);
+}
+
+/*
+ * packrealname(cpp,name,realname) makes realname contain the directory at *cpp,
+ * followed by '/', followed by the characters in name up until the
+ * first blank there, and finally a '\0'. The cpp pointer is left pointing
+ * at the next directory in the path.
+ * But: if *cpp == NULL, then we are supposed to use name as is.
+ */
+static packrealname(cpp,name,realname)
+ char **cpp;
+ char *name, *realname;
+{
+ register char *p,*tempname;
+
+ tempname = realname;
+ if ((p = *cpp)!=NULL) {
+ while ((*p != ':') && (*p != '\0')) {
+ *tempname++ = *p++;
+ if (tempname == &(realname[namelength-1]))
+ break;
+ }
+ if (*p == '\0') *cpp = NULL; /* at end of path now */
+ else *cpp = p+1; /* else get past ':' */
+ *tempname++ = '/'; /* separate the area from the name to follow */
+ }
+ /* now append name to tempname... */
+ /* There was a very peculiar bug here, I tried to fix it. (RMD).
+ Originally this said "p = name+1 ;" this cut off the
+ first character of the name */
+ p = name ;
+ while (*p != ' ') {
+ if (tempname >= &(realname[namelength-1])) {
+ (void) fprintf(stderr,"! Full file name is too long\n");
+ break;
+ }
+ *tempname++ = *p++;
+ }
+ *tempname = '\0';
+}