|
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 c
Length: 4151 (0x1037) Types: TextFile Names: »context.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦e7f64e0c0⟧ »EurOpenD3/mail/vmh.tar.Z« └─⟦dcb95597f⟧ └─⟦this⟧ »context.c«
#ifndef lint static char rcsid[] = "$Header: context.c,v 1.8 86/10/09 15:59:57 deboor Exp $"; static char notice[] = "This program is in the public domain and is available for unlimited \ distribution as long as this notice is enclosed."; #endif /* * Routines for dealing with the context file. * * $Source: /c/support/deboor/usr/src/old/vmh/RCS/context.c,v $ * $Revision: 1.8 $ * $Author: deboor $ * * FUNCTIONS: * get_cur_fold() returns the name of the current folder as specified * in the context file. * set_cur_fold() installs the passed folder as the current one in * the context file. * * TODO: add reading of private sequences init_sequences(): should it be * done here or there? * */ #include "vmh.h" /* * find_context (buf, buflen) register char *buf; register buflen; * fills buf with the name of the context file. */ find_context (buf, buflen) Reg2 char *buf; Reg3 int buflen; { Reg1 char *cp; char line[132]; #ifdef MH6 if (cp = getenv ("MHCONTEXT")) { if (*cp != '/') (void) sprintf (buf, "%s/%s", rootpath, cp); else (void) strncpy (buf, cp, buflen); } else { #endif MH6 if (!readprofile ("context:", line, sizeof(line))) (void) sprintf (buf, "%s/%s", rootpath, context); else { if (*line != '/') (void) sprintf (buf,"%s/%s",rootpath,line); else (void) strncpy (buf, line, buflen); } #ifdef MH6 } #endif MH6 } /* * char * * get_cur_fold() * returns a pointer to the name of the current folder. If the folder * depends from the MH directory, only the folder name (i.e. minus * the rootpath) is returned, else the full path of the folder is returned. */ char * get_cur_fold() { char contextp[PATHLENGTH]; register FILE *cfile; char line[PATHLENGTH]; register hlen; register char *cp, *cp2; find_context (contextp, sizeof(contextp)); if ((cfile = fopen (contextp, "r")) == NULL) { punt ("Can't open context file!"); } while ((hlen = readheader (line, sizeof(line), cfile, TRUE))) { if (uprf (line, pfolder)) { if (!(cp = index (line, ':'))) punt ("Malformed context file!"); while (isspace (*++cp)) /* void */ ; cp2 = contextp; while (!isspace (*cp)) *cp2++ = *cp++; *cp2 = '\0'; cp2 = contextp; if (*cp2 == '/' && !strncmp (rootpath,cp2,rootlen)) cp2 = &contextp[rootlen+1]; cp = (char *) Malloc (strlen (cp2)+1); (void) strcpy (cp, cp2); (void) fclose (cfile); return (cp); } else { while (hlen < 0) hlen = readheader(line,sizeof(line),cfile,TRUE); } } (void) fclose (cfile); cp = (char *) Malloc (strlen (defalt)+1); (void) strcpy (cp, defalt); return (cp); } /* * set_cur_fold (fname) char *fname; * sets the current folder in the context file to fname. * the current context folder is backed up before it is changed. If an * error occurs, an attempt is made to restore the previous context. * If this attempt fails, the old context is left in the file * <old-context>.bak where <old-context> is the name of the context * file. */ set_cur_fold (fname) char *fname; { FILE *cfile, *tcfile; char line[256]; char contextp[PATHLENGTH]; char tcontextp[PATHLENGTH]; extern int errno; int terr; find_context (contextp, sizeof(contextp)); (void) sprintf (tcontextp, "%s.bak", contextp); if (rename(contextp, tcontextp) == -1) { punt ("Can't backup context file"); /*NOTREACHED*/ } if ((cfile = fopen (contextp, "w")) == NULL) { terr = errno; if (rename (tcontextp, contextp)) { errno = terr; punt ("Can't open new context file. .bak file left"); } else { errno = terr; punt ("Can't open new context file. Old file restored"); } /*NOTREACHED*/ } if ((tcfile = fopen (tcontextp, "r")) == NULL) { punt ("Cannot open old context file!"); /*NOTREACHED*/ } while (fgets (line, sizeof(line), tcfile)) { if (uprf (line, pfolder)) { if (!strncmp (fname, rootpath, rootlen)) { fprintf (cfile, "%s: %s\n", pfolder, &fname[rootlen+1]); } else { fprintf (cfile, "%s: %s\n", pfolder, fname); } } else { fputs (line, cfile); } } (void) fclose (cfile); (void) fclose (tcfile); (void) unlink (tcontextp); }