summaryrefslogtreecommitdiffstats
path: root/lib/libmytinfo/buildpath.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libmytinfo/buildpath.c')
-rw-r--r--lib/libmytinfo/buildpath.c203
1 files changed, 203 insertions, 0 deletions
diff --git a/lib/libmytinfo/buildpath.c b/lib/libmytinfo/buildpath.c
new file mode 100644
index 0000000..cecba42
--- /dev/null
+++ b/lib/libmytinfo/buildpath.c
@@ -0,0 +1,203 @@
+/*
+ * buildpath.c
+ *
+ * By Ross Ridge
+ * Public Domain
+ * 92/02/01 07:29:42
+ *
+ * _buildpath builds a list of file names and terminal descriprions extracted
+ * from its arguments. It returns a pointer to a structure that is used by
+ * other routines as the list of file names to search for terminal
+ * descriptions. It is passed a variable number of arguments consisting
+ * of file name and type pairs. The file name can actually be a list of
+ * file names seperated by spaces and any environment variables specified
+ * by a dollar sign ($) followed by its name are substituted in. A type
+ * of 1 indicates that the file name may actually be termcap description
+ * and a type of 2 indicates it may be a terminfo description. A type of 0
+ * indicates that the file name can only be a file name (or list of them).
+ *
+ */
+
+#include "defs.h"
+
+#include <ctype.h>
+
+#ifdef USE_SCCS_IDS
+static const char SCCSid[] = "@(#) mytinfo buildpath.c 3.2 92/02/01 public domain, By Ross Ridge";
+#endif
+
+/* more memory is allocated for file names every HUNK file names */
+#define HUNK 32
+
+/* characters that seperate file names in a list */
+#define SEPERATORS " :"
+
+static struct term_path *path = NULL; /* the list of files */
+static int files = 0; /* # of files in the list */
+static int size = 0; /* # of files there is space for */
+
+/* add a file name, type pair to the list */
+static int
+addfile(file, type)
+char *file;
+int type; {
+ int l;
+ char *s;
+
+ if (file == NULL) {
+ if (type != -1)
+ return -1;
+ } else if (file[0] == '\0')
+ return -1;
+
+#ifdef DEBUG
+ if (file != NULL)
+ printf("addfile: %s\n", file);
+#endif
+
+ if (files >= size) {
+ size += HUNK;
+ if (path == NULL)
+ path = (struct term_path *)
+ malloc(size * sizeof(struct term_path));
+ else
+ path = (struct term_path *)
+ realloc((anyptr) path,
+ size * sizeof(struct term_path));
+ if (path == NULL)
+ return 0;
+ }
+ if (file == NULL) {
+ path[files].file = file;
+ } else {
+ l = strlen(file) + 1;
+ s = (char *) malloc(l * sizeof(char));
+ if (s == NULL)
+ return 0;
+ path[files].file = strcpy(s, file);
+ }
+ path[files].type = type;
+
+ return ++files;
+}
+
+/* deallocate space used by the path list */
+void
+_delpath(ppath)
+struct term_path *ppath; {
+ struct term_path *p;
+
+ p = ppath;
+ while(p->file != NULL) {
+ free((anyptr)p->file);
+ p++;
+ }
+
+ free((anyptr)ppath);
+}
+
+/* build a list of paths. see above */
+#ifdef lint
+/*VARARGS2*/
+struct term_path *
+_buildpath(file, type)
+char *file;
+int type;
+#else
+#ifdef USE_STDARG
+#ifdef USE_PROTOTYPES
+struct term_path *_buildpath(char *file, int type, ...)
+#else
+struct term_path *_buildpath(file, type)
+char *file;
+int type;
+#endif /* USE_PROTOTYPES */
+#else /* USE_STDARG */
+struct term_path *_buildpath(va_alist)
+va_dcl
+#endif /* USE_STDARG */
+#endif /* lint */
+{
+#ifndef lint
+#ifndef USE_STDARG
+ char *file;
+ int type;
+#endif
+#endif
+ va_list ap;
+ register char *s, *d, *e;
+ char *p;
+ char line[MAX_BUF+1];
+ char name[MAX_NAME+1];
+ int i,j;
+
+ size = 0;
+ files = 0;
+ path = NULL;
+
+#ifdef lint
+ ap = NULL;
+#else
+#ifdef USE_STDARG
+ va_start(ap, type);
+#else
+ va_start(ap);
+ file = va_arg(ap, char *);
+ type = va_arg(ap, int);
+#endif
+#endif
+
+ while (type >= 0 && type <= 2) {
+ s = file;
+ d = line;
+ i = 0;
+ while(*s != '\0') {
+ if (*s == '$') {
+ s++;
+ j = 0;
+ while(*s != '\0' && (*s == '_' || isalnum(*s)))
+ if (j < MAX_NAME) {
+ name[j] = *s++;
+ j++;
+ } else
+ break;
+ name[j] = '\0';
+ e = getenv(name);
+ if (e != NULL) {
+ while(*e != '\0') {
+ if (i < MAX_BUF) {
+ *d++ = *e++;
+ i++;
+ } else
+ break;
+ }
+ } else if (*s == '/')
+ s++;
+ } else {
+ if (i < MAX_BUF) {
+ *d++ = *s++;
+ i++;
+ } else
+ break;
+ }
+ }
+ *d = '\0';
+ if (type == 0 || line[0] == '/') {
+ p = line;
+ while ((s = strsep(&p, SEPERATORS)) != NULL && *s == '\0')
+ ;
+ while(s != NULL) {
+ if (addfile(s, 0) == 0)
+ return NULL;
+ while ((s = strsep(&p, SEPERATORS)) != NULL && *s == '\0')
+ ;
+ }
+ } else
+ if (addfile(line, type) == 0)
+ return NULL;
+ file = va_arg(ap, char *);
+ type = va_arg(ap, int);
+ }
+ addfile(NULL, -1);
+ return path;
+}
OpenPOWER on IntegriCloud