home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume30 / parseargs / patch13 / PATCH13
Encoding:
Text File  |  1992-06-20  |  19.6 KB  |  536 lines

  1. *** patchlevel.h.parseargs_patch12    Sat May 30 18:10:20 1992
  2. --- patchlevel.h    Sat May 30 17:46:52 1992
  3. ***************
  4. *** 3,8 ****
  5. --- 3,13 ----
  6.   **
  7.   ** ^HISTORY:
  8.   **
  9. + **    05/30/92    Brad Appleton    <brad@ssd.csd.harris.com>
  10. + **    Patch13
  11. + **    - Finishing touches to get parseargs working successfully with
  12. + **      the tcl shell (parseargs.tcl works now).
  13. + **
  14.   **    05/18/92    Brad Appleton    <brad@ssd.csd.harris.com>
  15.   **    Patch12
  16.   **    - Fixes to the Makefile and for tcl.
  17. ***************
  18. *** 161,167 ****
  19.   
  20.   #define  VERSION     2
  21.   #define  REVISION    0
  22. ! #define  PATCHLEVEL  12
  23.   
  24.   #ifdef __STDC__
  25.      static const char
  26. --- 166,172 ----
  27.   
  28.   #define  VERSION     2
  29.   #define  REVISION    0
  30. ! #define  PATCHLEVEL  13
  31.   
  32.   #ifdef __STDC__
  33.      static const char
  34. ***************
  35. *** 168,171 ****
  36.   #else
  37.      static char
  38.   #endif
  39. !    _Ident[] = "@(#)parseargs  2.0  patchlevel 12";
  40. --- 173,176 ----
  41.   #else
  42.      static char
  43.   #endif
  44. !    _Ident[] = "@(#)parseargs  2.0  patchlevel 13";
  45. *** Makefile.parseargs_patch12    Sat May 30 18:10:17 1992
  46. --- Makefile    Sat May 30 17:46:42 1992
  47. ***************
  48. *** 23,28 ****
  49. --- 23,29 ----
  50.   LIBDIR = ${LOCAL}/lib
  51.   INCDIR = ${LOCAL}/include
  52.   PERLLIB = ${LIBDIR}/perl
  53. + TCLLIB = ${LIBDIR}/tcl
  54.   
  55.   ###
  56.   # compilation options
  57. ***************
  58. *** 99,106 ****
  59.           doc/sparseargs3.inc \
  60.           doc/usage3.inc \
  61.           doc/vparseargs3.inc
  62. ! SCRIPTS =    test.sh  test.csh  test.ksh  test.rc  test.awk  test.pl
  63.   PERLSUB =    ${NAME}.pl
  64.   XXFILES =    Intro  README  MANIFEST  Makefile  VMSbuild.com
  65.   
  66.   HDRS =    ${NAME}.h \
  67. --- 100,108 ----
  68.           doc/sparseargs3.inc \
  69.           doc/usage3.inc \
  70.           doc/vparseargs3.inc
  71. ! SCRIPTS =    test.sh  test.csh  test.ksh  test.rc  test.awk  test.pl test.tcl
  72.   PERLSUB =    ${NAME}.pl
  73. + TCLSUB  =    ${NAME}.tcl
  74.   XXFILES =    Intro  README  MANIFEST  Makefile  VMSbuild.com
  75.   
  76.   HDRS =    ${NAME}.h \
  77. ***************
  78. *** 138,144 ****
  79.   PROG_OBJS =  ${NAME}.o   unix_man.o
  80.   TEST_OBJS =  stest.o
  81.   
  82. ! FILES =    ${XXFILES} ${DOCS} ${HDRS} ${SRCS} ${PERLSUB} ${SCRIPTS}
  83.   
  84.   ###
  85.   # target dependencies
  86. --- 140,146 ----
  87.   PROG_OBJS =  ${NAME}.o   unix_man.o
  88.   TEST_OBJS =  stest.o
  89.   
  90. ! FILES =    ${XXFILES} ${DOCS} ${HDRS} ${SRCS} ${PERLSUB} ${TCLSUB} ${SCRIPTS}
  91.   
  92.   ###
  93.   # target dependencies
  94. ***************
  95. *** 184,203 ****
  96.            ${LIBDIR}/${LIBFILE} \
  97.            ${LOCAL}/${PROGRAM}
  98.   
  99. !  ${INCDIR}/${NAME}.h: ${NAME}.h useful.h
  100.       ( ${CHDIR} ${INCDIR}; ${DEL} ${NAME}.h useful.h )
  101.       ${COPY} ${NAME}.h useful.h ${INCDIR}
  102.   
  103. !  ${LIBDIR}/${LIBFILE}: ${LIBARGS}
  104.       ${DEL}   ${LIBDIR}/${LIBFILE}
  105.       ${COPY} ${LIBARGS}   ${LIBDIR}/${LIBFILE}
  106.       ${RANLIB}   ${LIBDIR}/${LIBFILE}
  107.   
  108. !  ${LOCAL}/${PROGRAM}: ${PROGRAM} ${PERLSUB}
  109. !     ${DEL} ${LOCAL}/${PROGRAM} ${PERLIB}/${PERLSUB}
  110.       ${COPY} ${PROGRAM} ${LOCAL}
  111.       ${STRIP} ${LOCAL}/${PROGRAM}
  112. !     ${COPY} ${PERLSUB} ${PERLLIB}
  113.   
  114.   ###
  115.   # maintenance dependencies
  116. --- 186,206 ----
  117.            ${LIBDIR}/${LIBFILE} \
  118.            ${LOCAL}/${PROGRAM}
  119.   
  120. ! ${INCDIR}/${NAME}.h: ${NAME}.h useful.h
  121.       ( ${CHDIR} ${INCDIR}; ${DEL} ${NAME}.h useful.h )
  122.       ${COPY} ${NAME}.h useful.h ${INCDIR}
  123.   
  124. ! ${LIBDIR}/${LIBFILE}: ${LIBARGS}
  125.       ${DEL}   ${LIBDIR}/${LIBFILE}
  126.       ${COPY} ${LIBARGS}   ${LIBDIR}/${LIBFILE}
  127.       ${RANLIB}   ${LIBDIR}/${LIBFILE}
  128.   
  129. ! ${LOCAL}/${PROGRAM}: ${PROGRAM} ${PERLSUB} ${TCLSUB}
  130. !     -${DEL} ${LOCAL}/${PROGRAM} ${PERLIB}/${PERLSUB} ${TCLLIB}/${TCLSUB}
  131.       ${COPY} ${PROGRAM} ${LOCAL}
  132.       ${STRIP} ${LOCAL}/${PROGRAM}
  133. !     -${COPY} ${PERLSUB} ${PERLLIB}
  134. !     -${COPY} ${TCLSUB} ${TCLLIB}
  135.   
  136.   ###
  137.   # maintenance dependencies
  138. *** test.tcl.parseargs_patch12    Sat May 30 18:10:20 1992
  139. --- test.tcl    Sat May 30 17:46:55 1992
  140. ***************
  141. *** 1,7 ****
  142. ! #!/usr/bin/tcl -q
  143.   
  144. ! source parseargs.tcl
  145.   
  146.   set arguments {
  147.     { '?', ARGHIDDEN, argUsage, NULL,    "Help : print usage and exit" },
  148.     { 'S', ARGVALOPT, argStr,   string,  "STRing : optional string arg" },
  149. --- 1,9 ----
  150. ! #!/usr/local/bin/tcl
  151.   
  152. ! load "parseargs.tcl"
  153.   
  154. + set scriptName "test.tcl"
  155.   set arguments {
  156.     { '?', ARGHIDDEN, argUsage, NULL,    "Help : print usage and exit" },
  157.     { 'S', ARGVALOPT, argStr,   string,  "STRing : optional string arg" },
  158. ***************
  159. *** 20,32 ****
  160.   set count 1
  161.   set dirname "."
  162.   set sepch ","
  163. ! set xflag ""
  164. ! set yflag "TRUE"
  165.   set files {}
  166.   set groups {}
  167. - set name ""
  168.   set string ""
  169. - set string_flag ""
  170.   
  171.   eval [ parseargs -u -a $arguments $scriptName $argv ]
  172.   
  173. --- 22,32 ----
  174.   set count 1
  175.   set dirname "."
  176.   set sepch ","
  177. ! set xflag 0
  178. ! set yflag 1
  179.   set files {}
  180.   set groups {}
  181.   set string ""
  182.   
  183.   eval [ parseargs -u -a $arguments $scriptName $argv ]
  184.   
  185. ***************
  186. *** 41,47 ****
  187.   echo "SepChar = $sepch"
  188.   echo "Name = $name"
  189.   echo "Files = $files"
  190. ! if {( "$string_flag" != "") } {
  191.     if {( "$string" == "" )} {
  192.       set string "!string arg ommitted on cmd-line!"
  193.     }
  194. --- 41,47 ----
  195.   echo "SepChar = $sepch"
  196.   echo "Name = $name"
  197.   echo "Files = $files"
  198. ! if {( [info exists string_flag] )} {
  199.     if {( "$string" == "" )} {
  200.       set string "!string arg ommitted on cmd-line!"
  201.     }
  202. *** doc/parseargs.man1.parseargs_patch12    Sat May 30 18:10:18 1992
  203. --- doc/parseargs.man1    Sat May 30 17:46:46 1992
  204. ***************
  205. *** 348,359 ****
  206.   specified to \fBparseargs\fP.
  207.   .\"-----------------------------------------------------------
  208.   .SH FILES
  209. ! .IP "\fI/usr/local/parseargs.pl\fP"
  210.   This file defines a \fIperl\fP function named \fIparseargs\fP to parse
  211.   arguments more conveniently for perl-scripts. The function is 
  212.   both documented and implemented in this file. The user should
  213.   ``require'' this file in his/her perl-script before invoking the
  214.   function.
  215.   .IP "\fI/usr/local/parseargs.awk\fP"
  216.   This file defines an \fIawk\fP function named \fIparseargs\fP to parse
  217.   arguments more conveniently for awk-scripts. The function is 
  218. --- 348,365 ----
  219.   specified to \fBparseargs\fP.
  220.   .\"-----------------------------------------------------------
  221.   .SH FILES
  222. ! .IP "\fI/usr/local/lib/perl/parseargs.pl\fP"
  223.   This file defines a \fIperl\fP function named \fIparseargs\fP to parse
  224.   arguments more conveniently for perl-scripts. The function is 
  225.   both documented and implemented in this file. The user should
  226.   ``require'' this file in his/her perl-script before invoking the
  227.   function.
  228. + .IP "\fI/usr/local/lib/tcl/parseargs.tcl\fP"
  229. + This file defines a \fItcl\fP procedure named \fIparseargs\fP to parse
  230. + arguments more conveniently for tcl-scripts. The procedure is 
  231. + both documented and implemented in this file. The user should
  232. + ``load'' this file in his/her tcl-script before invoking the
  233. + procedure.
  234.   .IP "\fI/usr/local/parseargs.awk\fP"
  235.   This file defines an \fIawk\fP function named \fIparseargs\fP to parse
  236.   arguments more conveniently for awk-scripts. The function is 
  237. *** parseargs.tcl.parseargs_patch12    Sat May 30 18:10:19 1992
  238. --- parseargs.tcl    Sat May 30 17:46:49 1992
  239. ***************
  240. *** 13,21 ****
  241.   # ^PROCEDURE: parseargs - parse command-line argument lists
  242.   #
  243.   # ^SYNOPSIS:
  244. ! #    parseargs <options> -- $scriptName arg [arg ...]
  245.   #
  246.   #        where <options> is any valid option combination for parseargs(1)
  247.   #
  248.   # ^DESCRIPTION:
  249.   #    Parseargs will invoke parseargs(1) with the options and arguments
  250. --- 13,22 ----
  251.   # ^PROCEDURE: parseargs - parse command-line argument lists
  252.   #
  253.   # ^SYNOPSIS:
  254. ! #    parseargs <options> -- $scriptName $argv
  255.   #
  256.   #        where <options> is any valid option combination for parseargs(1)
  257. + #        and $argv is a list.
  258.   #
  259.   # ^DESCRIPTION:
  260.   #    Parseargs will invoke parseargs(1) with the options and arguments
  261. ***************
  262. *** 22,122 ****
  263.   #    specified by the caller.
  264.   #
  265.   # ^RETURN-VALUE:
  266. ! #    A string of variable settings for the caller to evaluate
  267.   #
  268.   # ^EXAMPLE:
  269. ! #     #!/usr/bin/tcl -q
  270.   #     
  271. ! #     source parseargs.tcl
  272.   #     
  273.   #     set arguments {
  274. ! #       { '?', ARGHIDDEN, argUsage, NULL,    "Help : print usage and exit" },
  275. ! #       { 'S', ARGVALOPT, argStr,   string,  "STRing : optional string arg" },
  276. ! #       { 'g', ARGLIST,   argStr,   groups,  "newsGROUPS : groups to test" },
  277. ! #       { 'r', ARGOPT,    argInt,   count,   "REPcount : group repeat count" },
  278. ! #       { 'd', ARGOPT,    argStr,   dirname, "DIRectory : working directory" },
  279. ! #       { 'x', ARGOPT,    argBool,  xflag,   "Xflag : turn on X-mode" },
  280. ! #       { 'y', ARGOPT,    argUBool, yflag,   "Yflag : turn off Y-mode" },
  281. ! #       { 's', ARGOPT,    argChar,  sepch,   "SEPchar : field separator" },
  282. ! #       { 'f', ARGLIST,   argStr,   files,   "files : files to process" },
  283. ! #       { 'n', ARGREQ|ARGPOS, argStr, name,  "name : name to use" },
  284. ! #       { ' ', ARGLIST,   argStr,   argv,    "argv : remaining arguments" },
  285. ! #       ENDOFARGS
  286.   #     }
  287.   #     
  288.   #     set count 1 ;    set dirname "." ;   set sepch "," ;
  289. ! #     set xflag "" ;   set yflag "TRUE" ;
  290. ! #     set files {} ;   set groups {} ;  set name "" ;
  291. ! #     set string "" ;  set string_flag "" ;
  292.   #     
  293. ! #     eval [ parseargs -u -a $arguments $scriptName $argv ]
  294.   #
  295. - #
  296. - # ^ALGORITHM:
  297. - #    We need to do an "eval exec parseargs $args" in order have exec
  298. - #    treat $args as many arguments instead of just one argument. Before
  299. - #    we can do that however, we must quote each argument in $args and
  300. - #    escape any special characters that it contains.  Hence we have the
  301. - #    following algorithm:
  302. - #
  303. - #       - quote and escape special character for each arg in $args
  304. - #       - do an "eval exec $args" and save the results
  305. - #       - if parseargs(1) exit-status is non-zero than exit (and make
  306. - #            sure the parseargs message(s) is/are printed).
  307. - #         else
  308. - #            return the standard-output of parseargs(1)
  309. - #         endif
  310. - #
  311. - #
  312. - # ^BUGS:
  313. - #    Actually - this procedure doesnt work. It has some problems,
  314. - #    some of which I know about and can describe below:
  315. - #
  316. - # 1) TCL refuses to let ME do the error-checking after exec'ing parseargs(1).
  317. - #    What I need to do is look at the exit-status and exit if it is non-zero.
  318. - #    If parseargs happens to write anything to stderr (which it always does
  319. - #    if it prints usage or a syntax error) then TCL automatically terminates
  320. - #    my procedure (not the process) and doesnt let me check the exit-status.
  321. - #
  322. - # 2) Error messages printed by parseargs(1) are prefixed with "Error: "
  323. - #    and suffixed by some other error-message info added by TCL. I dont
  324. - #    want ANY of this, just let parseargs(1) print the error text and dont
  325. - #    embellish it. As a fix, I tried to have parseargs(1) write error messages
  326. - #    to stdout (for TCL only) and exit with a non-zero status. This didnt
  327. - #    work at all (and Im not completely sure as to why).
  328. - #
  329. - # 3) I ought to be able to use far fewer "regsub" statements below but I
  330. - #    couldnt seem to get "&" or "\0" to work as documented as substitution
  331. - #    strings.
  332. - #
  333. - # If you happen to get this procedure (along with test.tcl) working, then
  334. - # please, PLEASE let me know and tell me how you did it!!
  335. - #
  336.   ###^^####
  337.   proc parseargs args {
  338. !    set escaped_args {}
  339. !    foreach arg $args {
  340. !       regsub -all "\\\\" "$arg" "\\\\" arg
  341. !       regsub -all "\\\$" "$arg" "\\\$" arg
  342. !       regsub -all "\\\[" "$arg" "\\\[" arg
  343. !       regsub -all "\]" "$arg" "\\\]" arg
  344. !       regsub -all "\{" "$arg" "\\\{" arg
  345. !       regsub -all "\]" "$arg" "\\\]" arg
  346. !       regsub -all "\"" "$arg" "\\\"" arg
  347. !       regsub -all "\t" "$arg" "\\t" arg
  348. !       regsub -all "\n" "$arg" "\\n" arg
  349. !       regsub -all "\r" "$arg" "\\r" arg
  350. !       regsub -all "\v" "$arg" "\\v" arg
  351. !       regsub -all "\f" "$arg" "\\f" arg
  352. !       regsub -all "\b" "$arg" "\\b" arg
  353. !       append escaped_args " \"$arg\""
  354.      }
  355. -    set  errorCode {}
  356. -    set  opt_settings [ eval exec parseargs -s tcl $escaped_args ]
  357. -    if {( $errorCode != {} )} { 
  358. -       ## echo $opt_settings
  359. -       exit [lindex $errorCode 2]
  360. -    }
  361. -    return  $opt_settings ;
  362.   }
  363.   
  364. --- 23,97 ----
  365.   #    specified by the caller.
  366.   #
  367.   # ^RETURN-VALUE:
  368. ! #    A string of variable settings for the caller to evaluate. 
  369. ! #    If parseargs(1) exits with a non-zero status, then execution
  370. ! #    is terminated.
  371.   #
  372.   # ^EXAMPLE:
  373. ! #     #!/usr/local/bin/tcl
  374.   #     
  375. ! #     load parseargs.tcl
  376.   #     
  377.   #     set arguments {
  378. ! #        { '?', ARGHIDDEN, argUsage, NULL,    "Help : print usage and exit" },
  379. ! #        { 'S', ARGVALOPT, argStr,   string,  "STRing : optional string arg" },
  380. ! #        { 'g', ARGLIST,   argStr,   groups,  "newsGROUPS : groups to test" },
  381. ! #        { 'r', ARGOPT,    argInt,   count,   "REPcount : group repeat count" },
  382. ! #        { 'd', ARGOPT,    argStr,   dirname, "DIRectory : working directory" },
  383. ! #        { 'x', ARGOPT,    argBool,  xflag,   "Xflag : turn on X-mode" },
  384. ! #        { 'y', ARGOPT,    argUBool, yflag,   "Yflag : turn off Y-mode" },
  385. ! #        { 's', ARGOPT,    argChar,  sepch,   "SEPchar : field separator" },
  386. ! #        { 'f', ARGLIST,   argStr,   files,   "files : files to process" },
  387. ! #        { 'n', ARGREQ|ARGPOS, argStr, name,  "name : name to use" },
  388. ! #        { ' ', ARGLIST,   argStr,   argv,    "argv : any remaining args" },
  389. ! #        ENDOFARGS
  390.   #     }
  391.   #     
  392.   #     set count 1 ;    set dirname "." ;   set sepch "," ;
  393. ! #     set xflag 0 ;    set yflag 1 ;
  394. ! #     set files {} ;   set groups {} ;
  395. ! #     set string "" ;
  396.   #     
  397. ! #     eval [ parseargs -decls $arguments $scriptName $argv ]
  398.   #
  399.   ###^^####
  400.   proc parseargs args {
  401. !       ## set temp-file name
  402. !    if {( ! [info exists env] )}  { set env(TMP) "/tmp" }
  403. !    if {( $env(TMP) == "" )}  { set env(TMP) "/tmp" }
  404. !    set tmpFileName "$env(TMP)/tmp[id process]"
  405. !        ## isolate the last argument (a list) from the rest
  406. !    set last [expr {[llength $args] - 1}]
  407. !    set cmdArgv [lindex $args $last]
  408. !    set cmdOpts [lrange $args 0 [expr {$last - 1}]]
  409. !       ## fork and exec
  410. !    if {( [set childPid [fork]] == 0 )} {
  411. !          ## This is the child ...
  412. !          ##    redirect stdout to temp-file and exec parseargs(1)
  413. !          ##
  414. !       set tmpFile [open $tmpFileName "w"]
  415. !       close stdout
  416. !       dup $tmpFile stdout
  417. !       close $tmpFile
  418. !       execl parseargs [concat -s tcl $cmdOpts $cmdArgv]
  419. !    } else {
  420. !          ## This is the parent ...
  421. !          ##    wait for the child, check its status, then return its output
  422. !          ##    dont forget to remove the temp-file.
  423. !          ##
  424. !       set childStatus [wait $childPid]
  425. !       set how [lindex $childStatus 1]
  426. !       set ret [lindex $childStatus 2]
  427. !       if {( ($how == "EXIT")  &&  ($ret == 0) )} {
  428. !          set variableSettings [exec cat $tmpFileName]
  429. !          unlink -nocomplain $tmpFileName
  430. !          return $variableSettings
  431. !       } else {
  432. !          unlink -nocomplain $tmpFileName
  433. !          exit [expr {$how == "EXIT" ? $ret : 127}]
  434. !       }
  435.      }
  436.   }
  437.   
  438. *** MANIFEST.parseargs_patch12    Sat May 30 18:10:16 1992
  439. --- MANIFEST    Sat May 30 17:46:39 1992
  440. ***************
  441. *** 5,11 ****
  442.    Makefile                   2    makefile for parseargs library
  443.    README                     1    release information
  444.    VMSbuild.com               2    VMS makefile for the parseargs library
  445. !  amiga_args.c               5    parse AmigaDOS command-lines
  446.    arglist.c                  3    implement the listXxxx functions for arglists
  447.    argtype.c                  5    implement the argXxxx argument type functions
  448.    doc                        1    directory containing documentation
  449. --- 5,11 ----
  450.    Makefile                   2    makefile for parseargs library
  451.    README                     1    release information
  452.    VMSbuild.com               2    VMS makefile for the parseargs library
  453. !  amiga_args.c               4    parse AmigaDOS command-lines
  454.    arglist.c                  3    implement the listXxxx functions for arglists
  455.    argtype.c                  5    implement the argXxxx argument type functions
  456.    doc                        1    directory containing documentation
  457. ***************
  458. *** 34,40 ****
  459.    doc/parsecntl.man3         1    {n,t}roff source for parsecntl(3)
  460.    doc/parsecntl3.inc         1    describe parsecntl(3)
  461.    doc/parsecntls.inc         2    describe function-codes for parsecntl(3)
  462. !  doc/parseflags.inc         3    describe parse flags
  463.    doc/parsemodes.inc         1    describe modes for parsecntl(3)
  464.    doc/returns.inc            2    describe function return values
  465.    doc/sh_arrays.inc          3    describe handling of shell arrays
  466. --- 34,40 ----
  467.    doc/parsecntl.man3         1    {n,t}roff source for parsecntl(3)
  468.    doc/parsecntl3.inc         1    describe parsecntl(3)
  469.    doc/parsecntls.inc         2    describe function-codes for parsecntl(3)
  470. !  doc/parseflags.inc         2    describe parse flags
  471.    doc/parsemodes.inc         1    describe modes for parsecntl(3)
  472.    doc/returns.inc            2    describe function return values
  473.    doc/sh_arrays.inc          3    describe handling of shell arrays
  474. ***************
  475. *** 43,52 ****
  476.    doc/usage3.inc             1    describe usage(3)
  477.    doc/vparseargs3.inc        1    describe vparseargs(3)
  478.    exit_codes.h               1    #defines for arguments to exit(3C)
  479. !  ibm_args.c                 6    parse MS-DOS and OS/2 command-lines
  480.    parseargs.awk              3    parseargs for awk
  481. !  parseargs.c               10    C source for parseargs(1)
  482. !  parseargs.h                8    include file for parseargs library
  483.    parseargs.pl               2    parseargs for perl
  484.    parseargs.tcl              2    parseargs for tcl
  485.    patchlevel.h               3    list of patches (most recent first)
  486. --- 43,52 ----
  487.    doc/usage3.inc             1    describe usage(3)
  488.    doc/vparseargs3.inc        1    describe vparseargs(3)
  489.    exit_codes.h               1    #defines for arguments to exit(3C)
  490. !  ibm_args.c                 5    parse MS-DOS and OS/2 command-lines
  491.    parseargs.awk              3    parseargs for awk
  492. !  parseargs.c                9    C source for parseargs(1)
  493. !  parseargs.h                7    include file for parseargs library
  494.    parseargs.pl               2    parseargs for perl
  495.    parseargs.tcl              2    parseargs for tcl
  496.    patchlevel.h               3    list of patches (most recent first)
  497. ***************
  498. *** 53,59 ****
  499.    pgopen.c                   4    pipe output to a pager
  500.    pgopen.h                   1    include file for pgopen.c
  501.    stest.c                    4    test program for parseargs(3)
  502. !  strfuncs.c                 7    string library
  503.    strfuncs.h                 2    include file for strfuncs.c
  504.    syserr.c                   3    diagnostic message printing routines
  505.    test.awk                   3    awk test program for parseargs(1)
  506. --- 53,59 ----
  507.    pgopen.c                   4    pipe output to a pager
  508.    pgopen.h                   1    include file for pgopen.c
  509.    stest.c                    4    test program for parseargs(3)
  510. !  strfuncs.c                 6    string library
  511.    strfuncs.h                 2    include file for strfuncs.c
  512.    syserr.c                   3    diagnostic message printing routines
  513.    test.awk                   3    awk test program for parseargs(1)
  514. ***************
  515. *** 66,73 ****
  516.    test.zsh                   2    Z shell test program for parseargs(1)
  517.    unix_args.c                5    parse Unix command-lines
  518.    unix_man.c                 4    print Unix manual-page templates
  519. !  useful.h                   4    common include file for the library
  520.    vms_args.c                 6    parse VAX/VMS DCL command-lines
  521.    vprintf.c                  3    portable vfprintf, vprintf, and vsprintf
  522.    winsize.c                  3    determine # rows and # columns of window
  523. !  xparse.c                   9    implement the parseargs library
  524. --- 66,73 ----
  525.    test.zsh                   2    Z shell test program for parseargs(1)
  526.    unix_args.c                5    parse Unix command-lines
  527.    unix_man.c                 4    print Unix manual-page templates
  528. !  useful.h                   3    common include file for the library
  529.    vms_args.c                 6    parse VAX/VMS DCL command-lines
  530.    vprintf.c                  3    portable vfprintf, vprintf, and vsprintf
  531.    winsize.c                  3    determine # rows and # columns of window
  532. !  xparse.c                   8    implement the parseargs library
  533.