peter@ficc.uu.net (Peter da Silva) (02/27/90)
Posting-number: Volume 10, Issue 83 Submitted-by: peter@ficc.uu.net (Peter da Silva) Archive-name: parseargs.p2 This isn't strictly speaking a patch... it's an extra file required by the first set of patches. I should just have posted the whole thing again... : #! /bin/sh # This is a shell archive, created at Ferranti International Controls Corp. # by peter (Peter da Silva +1 713 274 5180) on Fri Feb 23 05:45:53 1990 # Remove anything before the "#! /bin/sh" line, then unpack it by saving # it into a file and typing "sh file". If you do not have sh, you need # unshar, a dearchiving program which is widely available. In the absolute # wost case, you can crack the files out by hand. # If the archive is complete, you will see the message "End of archive." # at the end. # This archive contains the following files... # 'arglist.c' # To extract them, run the following through /bin/sh echo x - arglist.c sed 's/^X//' > arglist.c << '//END_OF_FILE' X#include <parseargs.h> X#include <ctype.h> X X#ifdef __STDC__ Xtypedef void *pointer; X#else Xtypedef char *pointer; X#endif X Xextern pointer malloc(); X X#define ALL_AD ad = argd; ad->ad_name != '\0'; ad++ X#define ALL_DEFS ad = _DefaultArgs; ad->ad_name != '\0'; ad++ X Xextern char *ProgName; X X/* Argument list utility routines. After processing, parseargs calls X * cleanup_lists to reverse all argument lists so they stay in order. X */ X X/* Reverse a list */ Xstruct arglist *reverselist(from) Xstruct arglist *from; X{ X struct arglist *to, *tmp; X X to = NULL; X while(from) { X tmp = from; /* remove top from old list */ X from = from->nl_next; X tmp->nl_next = to; /* insert top in new list */ X to = tmp; X } X return to; X} X X/* Reverse all arglists in argd */ Xcleanup_lists(argd) XARGDESC *argd; X{ X ARGDESC *ad; X X for(ALL_AD) { X if( (ad->ad_flags & ARGLIST) && X *(struct arglist **)ad->ad_valp) { X *(struct arglist **)ad->ad_valp = X reverselist( *(struct arglist **)ad->ad_valp ); X } X } X} X X/* X** ARGlist -- list argument translation routines. X** X** Each of these converts a parameter value to the internal form, X** including validity checking. Their parameters and return values X** all behave identically. These are the routines for dealing with X** lists... X** X** Parameters: X** ad -- the argument descriptor for this parameter. X** vp -- a pointer to the string input value. X** copyf -- if TRUE, the value will be destroyed later, X** and so should be copied if it will be retained X** (as for a string). X** X** Returns: X** TRUE -- if the conversion was successful. The actual X** value should be added to the list stored in the X** location indicated by ad->ad_valp. X** FALSE -- if the conversion failed. The reason for failure X** should be diagnosed using usrerr(). X** X** Side Effects: X** The value should be stored through ad->ad_valp. X*/ X XBOOL XlistStr(ad, vp, copyf) X register ARGDESC *ad; X register char *vp; X BOOL copyf; X{ X char *cp; X struct arglist *nl; X X if (copyf) X { X register int i; X X i = strlen(vp) + 1; X cp = (char *) malloc(i); X if(!cp) { X usrerr("out of memory saving string %s", ad->ad_prompt); X return FALSE; X } X bcopy(vp, cp, i); X } X else X { X cp = vp; X } X X nl = (struct arglist *) malloc(sizeof *nl); X if(!nl) { X usrerr("out of memory saving arg %s", ad->ad_prompt); X if(copyf) free(cp); X return FALSE; X } X X nl->nl_next = *(struct arglist **) ad->ad_valp; X nl->nl_val = (ARBPTR)cp; X *(struct arglist **) ad->ad_valp = nl; X return (TRUE); X} X //END_OF_FILE echo "End of archive." # end of archive. exit 0 -- _--_|\ Peter da Silva. +1 713 274 5180. <peter@ficc.uu.net>. / \ \_.--._/ Xenix Support -- it's not just a job, it's an adventure! v "Have you hugged your wolf today?" `-_-'