|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T u
Length: 6203 (0x183b) Types: TextFile Names: »ut_msg.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Lib/pp/ut_msg.c«
/* ut_msg.c: library of routines to read a message directory struct */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/pp/RCS/ut_msg.c,v 5.0 90/09/20 16:13:00 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Lib/pp/RCS/ut_msg.c,v 5.0 90/09/20 16:13:00 pp Exp Locker: pp $ * * $Log: ut_msg.c,v $ * Revision 5.0 90/09/20 16:13:00 pp * rcsforce : 5.0 public release * */ #include "head.h" #include <isode/usr.dirent.h> #include <sys/stat.h> #include <isode/cmd_srch.h> #define NULLDIR ((DIR*)0) #define NULLDCT ((struct dirent *)0) extern CMD_TABLE qtbl_con_type [/* content-type */]; extern char *mquedir; extern char *quedfldir; extern int errno; static int fcmp(); static DIR *ST_dir = NULLDIR; static char *ST_array[LOTS]; static char *ST_name = NULLCP; static int ST_curr = NULL; static int ST_level = NULL; static int ST_no = NULL; int msg_rend (); static void UM_array_free (); static struct dirent *UM_readdir (); static int UM_isdir (); static int UM_rfile (); static void UM_push (); static struct dirent *UM_pop (); static int fcmp (); static int recur_fcmp (); /* ------------------------ External Routines -------------------------- */ static int basedir_len; int msg_rinit (dir) char *dir; { PP_DBG (("Lib/pp/msg_rinit: (%s)", dir)); if (ST_dir) msg_rend(); ST_level = 0; ST_name = malloc (LINESIZE); bzero (ST_name, LINESIZE); (void) strcpy (ST_name, dir); if (!UM_isdir (ST_name)) { PP_LOG (LLOG_EXCEPTIONS, ("Lib/pp/msg_rinit: %s is not a dir", ST_name)); return (RP_FOPN); } if ((ST_dir = opendir (ST_name)) == NULLDIR) { PP_LOG (LLOG_EXCEPTIONS, ("Lib/pp/msg_rinit: unable to open %s", ST_name)); return (RP_FOPN); } basedir_len = strlen(ST_name); return (RP_OK); } int msg_rfile (buf) char *buf; { char *ptr; PP_DBG (("Lib/pp/msg_rfile: (%s)", ST_name)); if (ST_no == NULL) { while (UM_rfile (buf) == RP_OK) { ptr = strdup (buf); ST_array [ST_no] = ptr; ++ST_no; } qsort ((char *)ST_array, ST_no, (sizeof (ST_array[0])), fcmp); } if (ST_curr < ST_no) { (void) strcpy (buf, ST_array[ST_curr]); ++ST_curr; return (RP_OK); } return (RP_DONE); } int msg_rend() { PP_DBG (("Lib/pp/msg_rend: (%s)", ST_name)); if (ST_dir) { closedir (ST_dir); ST_dir = NULLDIR; } if (ST_name) { free (ST_name); ST_name = NULLCP; } if (ST_no) UM_array_free(); ST_level = NULL; return (RP_OK); } static int fcmp (f1, f2) register char **f1, **f2; { char *stripedf1, *stripedf2; stripedf1 = (*f1)+basedir_len+1; stripedf2 = (*f2)+basedir_len+1; return recur_fcmp(stripedf1,stripedf2); } static int recur_fcmp(f1,f2) register char *f1, *f2; { /* atoi stops at the first non digit */ int f1digit = atoi(f1); int f2digit = atoi(f2); if (f1digit < f2digit) return -1; else if (f1digit > f2digit) return 1; else { int f1isdir, f2isdir; char *ixf1, *ixf2; /* dificult case may have to recurse */ f1isdir = ((ixf1 = index(f1,'/')) != NULL); f2isdir = ((ixf2 = index(f2,'/')) != NULL); if (f1isdir && f2isdir) return recur_fcmp(++ixf1,++ixf2); return 0; } } /* -------------------------- Static Routines -------------------------- */ static int UM_rfile (buf) char *buf; { struct dirent *dp; if (ST_dir == NULLDIR) { PP_LOG (LLOG_EXCEPTIONS, ("Lib/pp/UM_rfile: opendir not performed")); return (RP_DONE); } dp = UM_readdir (NULLCP); if (dp == NULLDCT) if (ST_level == 0) return (RP_DONE); else if ((dp = UM_pop()) == NULLDCT) return (RP_DONE); if (UM_isdir (dp->d_name)) { /* new subdir */ UM_push (dp->d_name); return (UM_rfile (buf)); } if (isstr (ST_name)) (void) sprintf (buf, "%s/%s", ST_name, dp->d_name); else (void) strcpy (buf, dp->d_name); return (RP_OK); } static struct dirent *UM_pop() { char tbuf[LINESIZE], *ptr; struct dirent *dp; --ST_level; ptr = rindex (ST_name, '/'); (void) strcpy (tbuf, ++ptr); *--ptr = '\0'; PP_DBG (("Lib/pp/UM_pop: (%s, %d)", ST_name, ST_level)); closedir (ST_dir); ST_dir = opendir (ST_name); dp = UM_readdir (&tbuf[0]); if (dp) return (dp); if (ST_level) return (UM_pop()); return (NULLDCT); } static void UM_push (name) char *name; { char tbuf[LINESIZE]; (void) sprintf (tbuf, "%s/%s", ST_name, name); (void) strcpy (ST_name, tbuf); closedir (ST_dir); PP_DBG (("Lib/pp/UM_push: (%s, %d)", ST_name, ST_level+1)); if ((ST_dir = opendir (ST_name)) == NULLDIR) { PP_LOG (LLOG_EXCEPTIONS, ("Lib/pp/UM_push: Unable to open %s", ST_name)); return; } ++ST_level; } static int UM_isdir (name) char *name; { struct stat st_rec; char tbuf[LINESIZE]; if (!isstr (name)) return (FALSE); (void) strcpy (&tbuf[0], ST_name); if (strcmp (ST_name, name) != 0) { (void) strcat (&tbuf[0], "/"); (void) strcat (&tbuf[0], name); } if (stat (&tbuf[0], &st_rec) == NOTOK) { PP_LOG (LLOG_EXCEPTIONS, ("Lib/pp/UM_isdir: Unable to stat %s %d", &tbuf[0], errno)); return (FALSE); } switch (st_rec.st_mode & S_IFMT) { case S_IFDIR: PP_DBG (("Lib/pp/UM_isdir (%s = TRUE)", &tbuf[0])); return (TRUE); default: PP_DBG (("Lib/pp/UM_isdir (%s = FALSE)", &tbuf[0])); return (FALSE); } } static struct dirent *UM_readdir (current) char *current; { struct dirent *dp; int passed_current = FALSE; if (current) PP_DBG (("Lib/pp/UM_readdir (current = %s)", current)); for (dp=readdir(ST_dir); dp != NULLDCT; dp=readdir(ST_dir)) { if (strcmp (dp->d_name, ".") == 0) continue; if (strcmp (dp->d_name, "..") == 0) continue; if (current) if (strcmp (dp->d_name, current) == 0) { passed_current = TRUE; continue; } else if (passed_current == FALSE) continue; break; } if (dp) PP_DBG (("Lib/pp/UM_readdir (%s)", dp->d_name)); return (dp); } static void UM_array_free () { int i; for (i=0; i < ST_no; i++) if (ST_array[i]) { free (ST_array [i]); ST_array[i] = NULLCP; } ST_no = NULL; ST_curr = NULL; }