/* parse_path_info WJS Aug 97 */ /* This program accepts a string formatted like the PATH_INFO */ /* environment variable. It will take the string from the command */ /* line invoking the program. If there is nothing on the command */ /* line, it will use PATH_INFO environment variable. */ /* The program also accepts an optional -nonewline switch con- */ /* trolling whether or not program output is followed by a newline */ /* character. */ /* The PATH_INFO environment variable contains 4 fields. This */ /* program outputs these 4 fields, followed by a newline, to stdout. */ /* The newline does not appear if the -nonewline switch is specified. */ /* It labels the first 3, but does NOT label the 4th. At present, the */ /* 4th already contains labelled information, so the effect will be to */ /* output a string containing an indefinite amount of labelled */ /* information... unless the format of the 4th field changes! At some */ /* future time, routines will be written to parse the 4th field and */ /* remove this potential problem */ /* A labelled field is of the form */ /* label=field */ /* The labelled fields are separated by commas. The assumption is */ /* that no field contains a comma or an equal sign. The labels are */ /* object, protocol, and level. Empty fields are output (eg, the */ /* the output string can contain "label=") */ /* The use of equal signs and commas is tied to the assumed format */ /* of the 4th field, again in hopeful anticipation... */ /* The program exits with a 250 (or whatever is defined in error_ */ /* exit_defn.h) if a bad switch is specified, if more than 1 input */ /* string is specified, if the PATH_INFO environment variable is */ /* improperly formatted or if there is trouble getting dynamic memory; */ /* 0 else. A partial result string may be output in error situations, */ /* followed by ***ERROR*** */ /* */ /* Example: if PATH_INFO has the value */ /* //gb1.whoi.edu/test.html0{dir=xx,info=yy} */ /* parse_path_info will write the string */ /* object=//gb1.whoi.edu/test,protocol=html,level=0,dir=xx,info=yy */ /* */ /* See the path_info_routines.c file for more information */ #define PARSE_PATH_INFO_ID "parse_path_info version 1.4 7 Mar 2008" /* 7 Mar 08 v 1.4 WJS */ /* Return only "old" format object names (w/ initial dbl slashes) */ /* [Needs path_info_routines.c v 1.4] */ /* [Needs path_info_routines.h v 1.4b] */ /* [Begin 1.4] */ /* 25 Apr 04 v 1.3 WJS */ /* Made this a "major" release & skipped version 1.2 to avoid */ /* "numbering" problems. Orig packaging got its version from */ /* path_info_routines.c, which changed faster than its calling */ /* routines like this one. W/that program now packaged w/the */ /* library, not clear what the version of THIS package should */ /* be... */ /* 11 Feb 04 v 1.3 WJS */ /* Fixes to avoid compiler warnings */ /* [Begin 1.3] */ /* [No version 1.2 - see v 1.3 comments] */ /* 18 Jul 99 v 1.1a WJS */ /* Allow -no as a synonym for -nonewline */ /* [Begin 1.1a] */ /* 20 Apr 99 v 1.1 WJS */ /* -nonewline switch */ /* New error exit status */ /* [Needs path_info_routines.c v 1.2] */ /* [Needs path_info_routines.h v 1.3] */ /* [Begin 1.1] */ /* 29 Aug 97 v 1.0 WJS */ /* Look for input on command line before using PATH_INFO */ /* 13 Aug 97 v 1.0 WJS */ /* [Needs path_info_routines.c v 1.2; .h v 1.1] */ /* [Begin 1.0] */ /* Force version string into object files */ char *parse_path_info_id = PARSE_PATH_INFO_ID; #include "path_info_routines.h" #include #include #include /* path_info_routines */ char *get_object_old_format(); char *get_protocol(); int get_level(); char *get_options(); void print_it(s,t,terminator) char *s,*t,*terminator; { if (s != NULL) printf ("%s%c",s,PATH_INFO_OPTIONS_DEFN_CHAR); if (t == NULL) { printf ("***ERROR***\n"); exit(ERROR_EXIT_STATUS); /* defined in error_exit_defn.h */ } else printf ("%s%s",t,terminator); return; } int main(argc,argv) int argc; char *argv[]; { int level; char c[2] = {PATH_INFO_OPTIONS_SEPARATOR_CHAR, '\0'}; char *ptr; char *input = NULL; char output_terminator[2] = "\n"; int i; for (i = 1; i < argc; i++) if (*argv[i] == '-') if ( (strcmp(argv[i],"-no") == 0) || (strcmp(argv[i],"-nonewline") == 0) ) output_terminator[0] = '\0'; else { printf ("***ERROR*** illegal switch: %s\n",argv[i]); exit(ERROR_EXIT_STATUS); /* defined in error_exit_defn.h */ } else { if (input != NULL) { printf ("***ERROR*** > 1 input param: %s %s\n",input,argv[i]); exit(ERROR_EXIT_STATUS); /* defined in error_exit_defn.h */ } input = argv[i]; } print_it("object",get_object_old_format(input),c); print_it("protocol",get_protocol(input),c); /* Look ahead, & don't put out trailing comma if options field */ /* is empty */ ptr = get_options(input); if (ptr != NULL) if (*ptr == '\0') *c = '\0'; level = get_level(input); if (level == LEVEL_NOT_SPECIFIED) print_it("level","",c); else if (level == LEVEL_ERROR) print_it("level",NULL,c); else printf("level%c%d%s",PATH_INFO_OPTIONS_DEFN_CHAR,level,c); print_it(NULL,ptr,output_terminator); exit(0); }