home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk1.iso / altsrc / articles / 7000-7999 / 7939 < prev    next >
Text File  |  1993-05-10  |  34KB  |  1,403 lines

  1. Newsgroups: alt.sources
  2. Path: wupost!darwin.sura.net!howland.reston.ans.net!noc.near.net!uunet!boulder!news
  3. From: panos@burton.cs.colorado.edu (Panos Tsirigotis)
  4. Subject: optgen: a generator of option recognition code (part 5 of 12)
  5. Message-ID: <1993May10.070401.14329@colorado.edu>
  6. Sender: news@colorado.edu (The Daily Planet)
  7. Nntp-Posting-Host: burton.cs.colorado.edu
  8. Organization: University of Colorado, Boulder
  9. Date: Mon, 10 May 1993 07:04:01 GMT
  10. Lines: 1391
  11.  
  12.  
  13. Submitted-by: Panos Tsirigotis (panos@cs.colorado.edu)
  14. Archive-name: optgen/part05
  15. Part:         05 of 12
  16.  
  17. ------------------------------ Cut here ------------------------------
  18. #! /bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 5 (of 12)."
  25. # Contents:  libs/src/misc/Makefile libs/src/misc/ftwx.c
  26. #   libs/src/sio/Makefile libs/src/sio/suite/copytest.c
  27. #   libs/src/sio/suite/tester libs/src/str/strparse.3
  28. #   libs/src/str/strs.3
  29. # Wrapped by panos@mystique on Sat May  8 13:28:31 1993
  30. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  31. if test -f 'libs/src/misc/Makefile' -a "${1}" != "-c" ; then 
  32.   echo shar: Will not clobber existing file \"'libs/src/misc/Makefile'\"
  33. else
  34. echo shar: Extracting \"'libs/src/misc/Makefile'\" \(3674 characters\)
  35. sed "s/^X//" >'libs/src/misc/Makefile' <<'END_OF_FILE'
  36. X# (c) Copyright 1992 by Panagiotis Tsirigotis
  37. X# All rights reserved.  The file named COPYRIGHT specifies the terms 
  38. X# and conditions for redistribution.
  39. X
  40. X#
  41. X# $Id: Makefile,v 2.9 1992/11/06 02:20:41 panos Exp $
  42. X#
  43. X# Based on Library makefile template: *Revision: 1.15 *
  44. X#
  45. X
  46. X# 
  47. X# Available entries:
  48. X#         lib             --> creates the library
  49. X#        install        --> installs the library (archive, man page(s), header(s))
  50. X#        uninstall    --> uninstall the library
  51. X#        clean            --> removes all .o and .a files
  52. X#        spotless        --> clean + uninstall
  53. X#         lint            --> lints a file (usage: make lint MODULE=foo.c)
  54. X#        tags            --> creates a tags file (from the SOURCES and HEADERS)
  55. X#        checkout     --> checkout all files
  56. X#        dist            --> distribution support
  57. X#
  58. X
  59. XNAME                = misc
  60. XVERSION            = 1.2.2
  61. X
  62. XHEADERS            = misc.h ftwx.h env.h
  63. XSOURCES            = misc.c ftwx.c env.c
  64. XOBJECTS            = misc.o ftwx.o env.o
  65. X
  66. XMANFILES            = misc.3 ftwx.3 env.3
  67. XINCLUDEFILES    = $(HEADERS)
  68. X
  69. X# The following variables are used by the 'install' entry and
  70. X# should be customized:
  71. X#     LIBDIR:     where the library will be placed
  72. X#     INCUDEDIR:  where the include files will be placed
  73. X#     MANDIR:     where the man pages will be placed
  74. X#
  75. XLIBDIR            = $(HOME)/.links/libraries/$(ARCH)
  76. XMANDIR            = $(HOME)/.links/manpages/man3
  77. XINCLUDEDIR        = $(HOME)/.links/includes
  78. X
  79. X#
  80. X# Possible flags:
  81. X#     -DOLD_DIR         : must include <sys/dir.h> instead of <dirent.h>
  82. X#     -D__FTWX_NO_FTW   : does not have <ftw.h>
  83. X#
  84. XDEFS                =                # used for command line defined flags
  85. X
  86. XDEBUG                = -g                # -g or -O
  87. XVERSION_DEF        = -DVERSION=\"MISC\ Version\ $(VERSION)\"
  88. X
  89. XCPP_DEFS            = $(VERSION_DEF) $(DEFS)
  90. X
  91. X#
  92. X# The following variables shouldn't need to be changed
  93. X#
  94. XLINT_FLAGS        = -hbux
  95. XCPP_FLAGS        = $(CPP_DEFS)
  96. XCC_FLAGS            = $(DEBUG)
  97. XCFLAGS            = $(CPP_FLAGS) $(CC_FLAGS)
  98. X
  99. XINSTALL            = install -c
  100. XFMODE                = -m 640            # used by install
  101. XRANLIB            = ranlib
  102. X
  103. XPAGER                = less
  104. X
  105. X
  106. XLIBNAME            = lib$(NAME).a
  107. X
  108. Xlib: $(LIBNAME)
  109. X
  110. Xlibopt: clean
  111. X    make DEBUG=-O lib
  112. X    mv $(LIBNAME) $(LIBDIR)/optimized
  113. X
  114. X
  115. X$(LIBNAME): $(OBJECTS)
  116. X    ar r $@ $?
  117. X    $(RANLIB) $@
  118. X
  119. Xlint:
  120. X    lint $(CPP_FLAGS) $(LINT_FLAGS) $(MODULE) 2>&1 | $(PAGER)
  121. X
  122. Xinstall: $(LIBNAME)
  123. X    @if test "$(LIBDIR)" -a "$(INCLUDEDIR)" -a "$(MANDIR)" ;\
  124. X    then \
  125. X        $(INSTALL) $(FMODE) $(LIBNAME) $(LIBDIR) ;\
  126. X        echo "Installed $(LIBNAME) to $(LIBDIR)" ;\
  127. X        for i in $(INCLUDEFILES); do $(INSTALL) $(FMODE) $$i $(INCLUDEDIR) ; done ;\
  128. X        echo Installed $(INCLUDEFILES) to $(INCLUDEDIR) ;\
  129. X        for i in $(MANFILES) ; do $(INSTALL) $(FMODE) $$i $(MANDIR) ; done ;\
  130. X        echo Installed $(MANFILES) to $(MANDIR) ;\
  131. X    else \
  132. X        echo "You forgot to set one of the following variables: LIBDIR,INCLUDEDIR,MANDIR" ;\
  133. X    fi
  134. X
  135. Xuninstall:
  136. X    a=`pwd` ; cd $(INCLUDEDIR) ;\
  137. X    if test $$a != `pwd` ; then rm -f $(INCLUDEFILES) ; fi
  138. X    a=`pwd` ; cd $(LIBDIR) ;\
  139. X    if test $$a != `pwd` ; then rm -f $(LIBNAME) ; fi
  140. X    a=`pwd` ; cd $(MANDIR) ;\
  141. X    if test $$a != `pwd` ; then rm -f $(MANFILES) ; fi
  142. X
  143. Xclean:
  144. X    rm -f $(OBJECTS) $(LIBNAME) core
  145. X
  146. Xspotless: clean uninstall
  147. X
  148. Xtags: $(SOURCES) $(HEADERS)
  149. X    ctags -w $(SOURCES) $(HEADERS)
  150. X
  151. Xcheckout:
  152. X    co $(SOURCES) $(HEADERS) $(MANFILES)
  153. X
  154. X#
  155. X# Distribution section
  156. X# This section contains the 2 targets for distribution support: dist, dirs
  157. X# "dist" checks out all files to be distributed
  158. X# "dirs" prints a list of directories to be included in the distribution.
  159. X# These directories should have a Makefile with a "dist" target
  160. X#
  161. XDISTRIBUTION_FILES    = $(HEADERS) $(SOURCES) $(MANFILES) README
  162. XDIRS                        =
  163. X
  164. Xdist:
  165. X    -co -q $(DISTRIBUTION_FILES)
  166. X
  167. Xdirs:
  168. X    @echo $(DIRS)
  169. X
  170. X#
  171. X# PUT HERE THE RULES TO MAKE THE OBJECT FILES
  172. X#
  173. Xmisc.o:        misc.h
  174. Xftwx.o:        ftwx.h misc.h
  175. Xenv.o:        env.h misc.h
  176. X
  177. X
  178. X#
  179. X# Test program
  180. X#
  181. Xtt: tt.c $(LIBNAME)
  182. X    $(CC) -g tt.c -o $@ $(LIBNAME) -L$(LIBDIR) -ltest
  183. X
  184. END_OF_FILE
  185. if test 3674 -ne `wc -c <'libs/src/misc/Makefile'`; then
  186.     echo shar: \"'libs/src/misc/Makefile'\" unpacked with wrong size!
  187. fi
  188. # end of 'libs/src/misc/Makefile'
  189. fi
  190. if test -f 'libs/src/misc/ftwx.c' -a "${1}" != "-c" ; then 
  191.   echo shar: Will not clobber existing file \"'libs/src/misc/ftwx.c'\"
  192. else
  193. echo shar: Extracting \"'libs/src/misc/ftwx.c'\" \(3822 characters\)
  194. sed "s/^X//" >'libs/src/misc/ftwx.c' <<'END_OF_FILE'
  195. X/*
  196. X * (c) Copyright 1992 by Panagiotis Tsirigotis
  197. X * All rights reserved.  The file named COPYRIGHT specifies the terms 
  198. X * and conditions for redistribution.
  199. X */
  200. X
  201. Xstatic char RCSid[] = "$Id: ftwx.c,v 2.1 1992/10/01 00:41:02 panos Exp $" ;
  202. X
  203. X#include <sys/types.h>
  204. X#include <sys/stat.h>
  205. X#include <sys/file.h>
  206. X#ifndef OLD_DIR
  207. X#include <dirent.h>
  208. X#else
  209. X#include <sys/dir.h>
  210. X#define dirent direct
  211. X#endif
  212. X
  213. Xextern int errno ;
  214. X
  215. X#include "misc.h"
  216. X#include "ftwx.h"
  217. X
  218. X#define PRIVATE            static
  219. X
  220. X#define NUL                    '\0'
  221. X
  222. X
  223. Xtypedef enum { NO, YES } boolean_e ;
  224. X
  225. Xstatic struct
  226. X{
  227. X    int (*stat_func)() ;
  228. X    int (*user_func)() ;
  229. X} ftwx_data ;
  230. X
  231. X/*
  232. X * ftwx is an extension to ftw, that optionally follows symlinks (the
  233. X * default is NOT to follow them).
  234. X *
  235. X * Possible flag values:
  236. X *        FTWX_FOLLOW:         follow symlinks
  237. X *
  238. X * Possible depth values:
  239. X *        0            : means only the specified path
  240. X *        positive : means go as deep as specified
  241. X *        FTWX_ALL : no depth limitation
  242. X *
  243. X * User function return value:
  244. X *        negative : means an error occured and the traversal should stop
  245. X *        0            : OK
  246. X *        positive : means that if the current object is a directory it
  247. X *                      should not be traversed.
  248. X *
  249. X * Return value:
  250. X *        -1         : if an error occurs
  251. X *  frv            : frv is the function return value if it is negative (it
  252. X *                      should not be -1).
  253. X *        0            : if successful
  254. X */
  255. Xint ftwx( path, func, depth, flags )
  256. X    char *path ;
  257. X    int (*func)() ;
  258. X    int depth ;
  259. X    int flags ;
  260. X{
  261. X    int stat(), lstat() ;
  262. X
  263. X    /*
  264. X     * Initialize the data structure
  265. X     */
  266. X    ftwx_data.stat_func = ( flags & FTWX_FOLLOW ) ? stat : lstat ;
  267. X    ftwx_data.user_func = func ;
  268. X
  269. X    return( ftwx_traverse( path, depth ) ) ;
  270. X}
  271. X
  272. X
  273. X
  274. X
  275. X/*
  276. X * ftwx_traverse works in two phases:
  277. X *
  278. X * Phase 1: process the current path
  279. X *
  280. X * Phase 2: if the current path is a directory, it invokes ftwx_traverse
  281. X *                for each directory entry
  282. X */
  283. XPRIVATE int ftwx_traverse( path, depth )
  284. X    char *path ;
  285. X    int depth ;
  286. X{
  287. X    DIR *dirp ;
  288. X    struct stat st ;
  289. X    int ftw_flag = 0 ;
  290. X    boolean_e traverse = YES ;
  291. X    int retval ;
  292. X    int save_errno ;
  293. X
  294. X    if ( (*ftwx_data.stat_func)( path, &st ) == -1 )
  295. X        ftw_flag = FTW_NS ;
  296. X    else
  297. X    {
  298. X        /*
  299. X         * If it is a directory and determine if it is readable
  300. X         * (if it is not readable, we don't traverse it
  301. X         */
  302. X        if ( S_ISDIR( st.st_mode ) )
  303. X            if ( access( path, R_OK ) == 0 )
  304. X                ftw_flag = FTW_D ;
  305. X            else
  306. X                ftw_flag = FTW_DNR ;
  307. X        else
  308. X            ftw_flag = FTW_F ;
  309. X    }
  310. X    retval = (*ftwx_data.user_func)( path, &st, ftw_flag ) ;
  311. X    if ( retval < 0 )
  312. X        return( retval ) ;
  313. X    else if ( retval > 0 && ftw_flag == FTW_D )
  314. X        traverse = NO ;
  315. X
  316. X    /*
  317. X     * Stop traversal if:
  318. X     *        a. depth reached 0
  319. X     *        b. the current path is not a readable directory
  320. X     *        c. the user doesn't want us to traverse this directory tree
  321. X     */
  322. X    if ( depth == 0 || ftw_flag != FTW_D || traverse == NO )
  323. X        return( 0 ) ;
  324. X
  325. X    if ( depth != FTWX_ALL )
  326. X        depth-- ;
  327. X
  328. X    if ( ( dirp = opendir( path ) ) == NULL )
  329. X        return( -1 ) ;
  330. X
  331. X    for ( ;; )
  332. X    {
  333. X        struct dirent *dp ;
  334. X        char *filename ;
  335. X
  336. X        errno = 0 ;            /* to detect readdir errors */
  337. X        dp = readdir( dirp ) ;
  338. X        if ( dp == NULL )
  339. X        {
  340. X            retval = ( errno == 0 ) ? 0 : -1 ;
  341. X            break ;
  342. X        }
  343. X
  344. X        /*
  345. X         * The special names: "." and ".." are skipped
  346. X         */
  347. X        if ( dp->d_name[ 0 ] == '.' )
  348. X            if ( dp->d_name[ 1 ] == NUL ||
  349. X                        dp->d_name[ 1 ] == '.' && dp->d_name[ 2 ] == NUL )
  350. X                continue ;
  351. X
  352. X        filename = make_pathname( 2, path, dp->d_name ) ;
  353. X        if ( filename == NULL )
  354. X        {
  355. X            retval = -1 ;
  356. X            break ;
  357. X        }
  358. X        
  359. X        retval = ftwx_traverse( filename, depth ) ;
  360. X        free( filename ) ;
  361. X
  362. X        /*
  363. X         * Check for a negative value instead of -1 because the
  364. X         * user function may use any negative value
  365. X         */
  366. X        if ( retval < 0 )
  367. X            break ;
  368. X    }
  369. X    /*
  370. X     * Make sure we don't trash errno; we should only do this if
  371. X     * retval is negative, but we are lazy...
  372. X     */
  373. X    save_errno = errno ;
  374. X    (void) closedir( dirp ) ;
  375. X    errno = save_errno ;
  376. X    return( retval ) ;
  377. X}
  378. X
  379. END_OF_FILE
  380. if test 3822 -ne `wc -c <'libs/src/misc/ftwx.c'`; then
  381.     echo shar: \"'libs/src/misc/ftwx.c'\" unpacked with wrong size!
  382. fi
  383. # end of 'libs/src/misc/ftwx.c'
  384. fi
  385. if test -f 'libs/src/sio/Makefile' -a "${1}" != "-c" ; then 
  386.   echo shar: Will not clobber existing file \"'libs/src/sio/Makefile'\"
  387. else
  388. echo shar: Extracting \"'libs/src/sio/Makefile'\" \(4227 characters\)
  389. sed "s/^X//" >'libs/src/sio/Makefile' <<'END_OF_FILE'
  390. X# (c) Copyright 1992, 1993 by Panagiotis Tsirigotis
  391. X# All rights reserved.  The file named COPYRIGHT specifies the terms 
  392. X# and conditions for redistribution.
  393. X
  394. X#
  395. X# $Id: Makefile,v 8.6 1993/03/30 21:34:09 panos Exp $
  396. X#
  397. X# Based on Library makefile template: *Revision: 1.15 *
  398. X#
  399. X
  400. X# 
  401. X# Available entries:
  402. X#         lib             --> creates the library
  403. X#        install        --> installs the library (archive, man page(s), header(s))
  404. X#        uninstall    --> uninstall the library
  405. X#        clean            --> removes all .o and .a files
  406. X#        spotless        --> clean + uninstall
  407. X#         lint            --> lints a file (usage: make lint MODULE=foo.c)
  408. X#        tags            --> creates a tags file (from the SOURCES and HEADERS)
  409. X#        checkout     --> checkout all files
  410. X#        dist            --> distribution support
  411. X#
  412. X
  413. XNAME                = sio
  414. XVERSION            = 1.6.2
  415. X
  416. XHEADERS            = sio.h impl.h events.h sioconf.h
  417. XSOURCES            = sprint.c sio.c siosup.c
  418. XOBJECTS            = sprint.o sio.o siosup.o
  419. X
  420. XMANFILES            = sio.3 Sprint.3
  421. XINCLUDEFILES    = sio.h
  422. X
  423. X# The following variables are used by the 'install' entry and
  424. X# should be customized:
  425. X#     LIBDIR:     where the library will be placed
  426. X#     INCUDEDIR:  where the include files will be placed
  427. X#     MANDIR:     where the man pages will be placed
  428. X#
  429. XLIBDIR            = $(HOME)/.links/libraries/$(ARCH)
  430. XMANDIR            = $(HOME)/.links/includes
  431. XINCLUDEDIR        = $(HOME)/.links/manpages/man3
  432. X
  433. X#
  434. X# Available flags:
  435. X#  -DDEBUG           :  enables assertions in the code. A failed assertion
  436. X#                       terminates the program
  437. X#  -DEVENTS          :  enables code that records events (currently limited
  438. X#                       to which functions have been called on a given fd)
  439. X#                       and code that accesses the event buffers.
  440. X#  -DLITTLE_ENDIAN   :  says that the machine is a little endian. This is
  441. X#                       needed if you enable EVENTS and your machine is a
  442. X#                       little endian (big endian is the default).
  443. X#
  444. X
  445. X#
  446. X# DEFS should be set from the command line; the current group of defs
  447. X# is for SunOS 4.x
  448. X#
  449. XDEFS                = -DHAS_MMAP -DHAS_ONEXIT -DHAS_MEMOPS -DHAS_ISATTY
  450. X
  451. XDEBUG                = -g            # -g or -O
  452. XVERSION_DEF        = -DVERSION=\"SIO\ Version\ $(VERSION)\"
  453. X
  454. XCPP_DEFS            = $(VERSION_DEF) $(DEFS)
  455. X
  456. X#
  457. X# The following variables shouldn't need to be changed
  458. X#
  459. XLINT_FLAGS        = -hbux
  460. XCPP_FLAGS        = $(CPP_DEFS)
  461. XCC_FLAGS            = $(DEBUG)
  462. XCFLAGS            = $(CPP_FLAGS) $(CC_FLAGS)
  463. X
  464. XINSTALL            = install -c
  465. XFMODE                = -m 640            # used by install
  466. XRANLIB            = ranlib
  467. X
  468. XPAGER                = less
  469. X
  470. X
  471. XLIBNAME            = lib$(NAME).a
  472. X
  473. Xlib: $(LIBNAME)
  474. X
  475. Xlibopt: clean
  476. X    make DEBUG=-O lib
  477. X    $(INSTALL) $(FMODE) $(LIBNAME) $(LIBDIR)/optimized
  478. X
  479. X$(LIBNAME): $(OBJECTS)
  480. X    ar r $@ $?
  481. X    $(RANLIB) $@
  482. X
  483. Xlint:
  484. X    lint $(CPP_FLAGS) $(LINT_FLAGS) $(MODULE) 2>&1 | $(PAGER)
  485. X
  486. Xinstall: $(LIBNAME)
  487. X    @if test "$(LIBDIR)" -a "$(INCLUDEDIR)" -a "$(MANDIR)" ;\
  488. X    then \
  489. X        $(INSTALL) $(FMODE) $(LIBNAME) $(LIBDIR) ;\
  490. X        echo "Installed $(LIBNAME) to $(LIBDIR)" ;\
  491. X        for i in $(INCLUDEFILES); do $(INSTALL) $(FMODE) $$i $(INCLUDEDIR) ; done ;\
  492. X        echo Installed $(INCLUDEFILES) to $(INCLUDEDIR) ;\
  493. X        for i in $(MANFILES) ; do $(INSTALL) $(FMODE) $$i $(MANDIR) ; done ;\
  494. X        echo Installed $(MANFILES) to $(MANDIR) ;\
  495. X    else \
  496. X        echo "You forgot to set one of the following variables: LIBDIR,INCLUDEDIR,MANDIR" ;\
  497. X    fi
  498. X
  499. Xuninstall:
  500. X    a=`pwd` ; cd $(INCLUDEDIR) ;\
  501. X    if test $$a != `pwd` ; then rm -f $(INCLUDEFILES) ; fi
  502. X    a=`pwd` ; cd $(LIBDIR) ;\
  503. X    if test $$a != `pwd` ; then rm -f $(LIBNAME) ; fi
  504. X    a=`pwd` ; cd $(MANDIR) ;\
  505. X    if test $$a != `pwd` ; then rm -f $(MANFILES) ; fi
  506. X
  507. Xclean:
  508. X    rm -f $(OBJECTS) $(LIBNAME) core
  509. X
  510. Xspotless: clean uninstall
  511. X
  512. Xtags: $(SOURCES) $(HEADERS)
  513. X    ctags -w $(SOURCES) $(HEADERS)
  514. X
  515. Xcheckout:
  516. X    co $(SOURCES) $(HEADERS) $(MANFILES)
  517. X
  518. X#
  519. X# Distribution section
  520. X# This section contains the 2 targets for distribution support: dist, dirs
  521. X# "dist" checks out all files to be distributed
  522. X# "dirs" prints a list of directories to be included in the distribution.
  523. X# These directories should have a Makefile with a "dist" target
  524. X#
  525. XDISTRIBUTION_FILES    = $(HEADERS) $(SOURCES) $(MANFILES) README COPYRIGHT
  526. XDIRS                        = suite
  527. X
  528. Xdist:
  529. X    -co -q $(DISTRIBUTION_FILES)
  530. X
  531. Xdirs:
  532. X    @echo $(DIRS)
  533. X
  534. X#
  535. X# PUT HERE THE RULES TO MAKE THE OBJECT FILES
  536. X#
  537. Xsprint.o:   sio.h impl.h sioconf.h
  538. Xsio.o:      sio.h impl.h sioconf.h events.h
  539. Xsiosup.o:   sio.h impl.h sioconf.h events.h
  540. X
  541. END_OF_FILE
  542. if test 4227 -ne `wc -c <'libs/src/sio/Makefile'`; then
  543.     echo shar: \"'libs/src/sio/Makefile'\" unpacked with wrong size!
  544. fi
  545. # end of 'libs/src/sio/Makefile'
  546. fi
  547. if test -f 'libs/src/sio/suite/copytest.c' -a "${1}" != "-c" ; then 
  548.   echo shar: Will not clobber existing file \"'libs/src/sio/suite/copytest.c'\"
  549. else
  550. echo shar: Extracting \"'libs/src/sio/suite/copytest.c'\" \(4262 characters\)
  551. sed "s/^X//" >'libs/src/sio/suite/copytest.c' <<'END_OF_FILE'
  552. X/*
  553. X * (c) Copyright 1992, 1993 by Panagiotis Tsirigotis
  554. X * All rights reserved.  The file named COPYRIGHT specifies the terms 
  555. X * and conditions for redistribution.
  556. X */
  557. X
  558. Xstatic char RCSid[] = "$Id: copytest.c,v 8.1 1993/03/13 01:21:48 panos Exp $" ;
  559. X
  560. X#include "sio.h"
  561. X#include <stdio.h>
  562. X#include <syscall.h>
  563. X
  564. X
  565. X/*************************************************************/
  566. X
  567. X#ifdef TEST_Sread
  568. X
  569. X#define BUFFER_SIZE  4096
  570. X
  571. Xmain()
  572. X{
  573. X    char buf[ BUFFER_SIZE ] ;
  574. X    int cc ;
  575. X    int nbytes ;
  576. X
  577. X    for ( ;; )
  578. X    {
  579. X        nbytes = random() & ( BUFFER_SIZE - 1 ) ;
  580. X        if ( nbytes == 0 )
  581. X            nbytes = 1 ;
  582. X        cc = Sread( 0, buf, nbytes ) ;
  583. X        if ( cc == 0 )
  584. X            break ;
  585. X        if ( cc == SIO_ERR )
  586. X            exit( 1 ) ;
  587. X        write( 1, buf, cc ) ;
  588. X    }
  589. X    exit( 0 ) ;
  590. X}
  591. X#endif /* TEST_Sread */
  592. X
  593. X/*************************************************************/
  594. X
  595. X#ifdef TEST_Swrite
  596. X
  597. X#define BUFFER_SIZE  4096
  598. X
  599. Xmain()
  600. X{
  601. X    char buf[ BUFFER_SIZE ] ;
  602. X    int cc ;
  603. X    int nbytes ;
  604. X
  605. X    for ( ;; )
  606. X    {
  607. X        nbytes = random() & ( BUFFER_SIZE - 1 ) ;
  608. X        if ( nbytes == 0 )
  609. X            nbytes = 1 ;
  610. X        cc = read( 0, buf, nbytes ) ;
  611. X        if ( cc == 0 )
  612. X            break ;
  613. X        if ( Swrite( 1, buf, cc ) != cc )
  614. X            exit( 1 ) ;
  615. X    }
  616. X    exit( 0 ) ;
  617. X}
  618. X#endif /* TEST_Swrite */
  619. X
  620. X/*************************************************************/
  621. X
  622. X#ifdef TEST_Srdline
  623. X
  624. Xmain()
  625. X{
  626. X    char *s ;
  627. X    int count=0 ;
  628. X
  629. X    while ( s = Srdline( 0 ) )
  630. X    {
  631. X        puts( s ) ;
  632. X        count++ ;
  633. X    }
  634. X    Sdone( 0 ) ;
  635. X    exit( 0 ) ;
  636. X}
  637. X
  638. X#endif  /* TEST_Srdline */
  639. X
  640. X/*************************************************************/
  641. X
  642. X#ifdef TEST_Sputchar
  643. X
  644. Xmain()
  645. X{
  646. X    int c ;
  647. X
  648. X    while ( ( c = getchar() ) != EOF )
  649. X        if ( Sputchar( 1, c ) != c )
  650. X            exit( 1 ) ;
  651. X    exit( 0 ) ;
  652. X}
  653. X
  654. X#endif /* TEST_Sputchar */
  655. X
  656. X/*************************************************************/
  657. X
  658. X#ifdef TEST_Sgetchar
  659. X
  660. Xmain()
  661. X{
  662. X    int c ;
  663. X
  664. X    while ( ( c = Sgetchar( 0 ) ) != SIO_EOF )
  665. X        putchar( c ) ;
  666. X    exit( 0 ) ;
  667. X}
  668. X
  669. X#endif    /* TEST_Sgetchar */
  670. X
  671. X/*************************************************************/
  672. X
  673. X#ifdef TEST_Sputc
  674. X
  675. Xmain()
  676. X{
  677. X   int c ;
  678. X   while ( ( c = getchar() ) != EOF )
  679. X      if ( Sputc( 1, c ) != c )
  680. X         exit( 1 ) ;
  681. X   exit( 0 ) ;
  682. X}
  683. X
  684. X#endif /* TEST_Sputc */
  685. X
  686. X/*************************************************************/
  687. X
  688. X#ifdef TEST_Sgetc
  689. X
  690. Xmain()
  691. X{
  692. X   int c ;
  693. X
  694. X   while ( ( c = Sgetc( 0 ) ) != SIO_EOF )
  695. X      putchar( c ) ;
  696. X   exit( 0 ) ;
  697. X}
  698. X
  699. X#endif /* TEST_Sgetc */
  700. X
  701. X/*************************************************************/
  702. X
  703. X#ifdef TEST_Sfetch
  704. X
  705. Xmain()
  706. X{
  707. X    char *s ;
  708. X    int len ;
  709. X
  710. X    while ( s = Sfetch( 0, &len ) )
  711. X        fwrite( s, 1, len, stdout ) ;
  712. X    exit( 0 ) ;
  713. X}
  714. X
  715. X#endif /* TEST_Sfetch */
  716. X
  717. X/*************************************************************/
  718. X
  719. X#ifdef TEST_Sflush
  720. X
  721. X#define MAX_COUNT        100
  722. X
  723. Xmain()
  724. X{
  725. X    int c ;
  726. X    int errval ;
  727. X    int count = 0 ;
  728. X    int max_count = random() % MAX_COUNT + 1 ;
  729. X
  730. X    while ( ( c = getchar() ) != EOF )
  731. X        if ( Sputchar( 1, c ) != c )
  732. X            exit( errval ) ;
  733. X        else
  734. X        {
  735. X            count++ ;
  736. X            if ( count >= max_count )
  737. X            {
  738. X                errval = Sflush( 1 ) ;
  739. X                if ( errval != 0 )
  740. X                    exit( 1 ) ;
  741. X                max_count = random() % MAX_COUNT + 1 ;
  742. X                count = 0 ;
  743. X            }
  744. X        }
  745. X    exit( 0 ) ;
  746. X}
  747. X
  748. X#endif /* TEST_Sflush */
  749. X
  750. X/*************************************************************/
  751. X
  752. X#ifdef TEST_Sundo
  753. X
  754. Xmain()
  755. X{
  756. X    int c ;
  757. X    char *s ;
  758. X    int errval ;
  759. X
  760. X    for ( ;; )
  761. X    {
  762. X        if ( random() % 1 )
  763. X        {
  764. X            s = Srdline( 0 ) ;
  765. X            if ( s == NULL )
  766. X                break ;
  767. X            if ( random() % 16 < 5 )
  768. X            {
  769. X                errval = Sundo( 0, SIO_UNDO_LINE ) ;
  770. X                if ( errval == SIO_ERR )
  771. X                    exit( 1 ) ;
  772. X            }
  773. X            else
  774. X                puts( s ) ;
  775. X        }
  776. X        else
  777. X        {
  778. X            c = Sgetchar( 0 ) ;
  779. X            if ( c == SIO_EOF )
  780. X                break ;
  781. X            if ( random() % 16 < 5 )
  782. X            {
  783. X                errval = Sundo( 0, SIO_UNDO_CHAR ) ;
  784. X                if ( errval == SIO_ERR )
  785. X                    exit( 2 ) ;
  786. X            }
  787. X            else
  788. X                putchar( c ) ;
  789. X        }
  790. X    }
  791. X    exit( 0 ) ;
  792. X}
  793. X
  794. X#endif /* TEST_Sundo */
  795. X
  796. X
  797. X#if defined( TEST_switch ) || defined( TEST_switch2 )
  798. X
  799. Xmain()
  800. X{
  801. X    int c ;
  802. X    char *s ;
  803. X    int lines = 4000 ;
  804. X
  805. X    for ( ;; )
  806. X    {
  807. X        c = Sgetchar( 0 ) ;
  808. X        if ( c == SIO_EOF )
  809. X            exit( 0 ) ;
  810. X        if ( c == SIO_ERR )
  811. X            exit( 1 ) ;
  812. X        putchar( c ) ;
  813. X        if ( c == '\n' )
  814. X        {
  815. X            lines-- ;
  816. X            if ( lines == 0 )
  817. X                break ;
  818. X        }
  819. X    }
  820. X    while ( s = Srdline( 0 ) )
  821. X        puts( s ) ;
  822. X    exit( 0 ) ;
  823. X}
  824. X
  825. X#ifdef TEST_switch2
  826. X
  827. Xchar *mmap( addr, len, prot, type, fd, off )
  828. X    char *addr ;
  829. X    int len, prot, type, fd, off ;
  830. X{
  831. X    return( (char *)-1 ) ;
  832. X}
  833. X
  834. X#endif    /* TEST_switch2 */
  835. X
  836. X#endif     /* TEST_switch */
  837. X
  838. X
  839. X
  840. END_OF_FILE
  841. if test 4262 -ne `wc -c <'libs/src/sio/suite/copytest.c'`; then
  842.     echo shar: \"'libs/src/sio/suite/copytest.c'\" unpacked with wrong size!
  843. fi
  844. # end of 'libs/src/sio/suite/copytest.c'
  845. fi
  846. if test -f 'libs/src/sio/suite/tester' -a "${1}" != "-c" ; then 
  847.   echo shar: Will not clobber existing file \"'libs/src/sio/suite/tester'\"
  848. else
  849. echo shar: Extracting \"'libs/src/sio/suite/tester'\" \(3971 characters\)
  850. sed "s/^X//" >'libs/src/sio/suite/tester' <<'END_OF_FILE'
  851. X#!/bin/sh
  852. X
  853. X# (c) Copyright 1992, 1993 by Panagiotis Tsirigotis
  854. X# All rights reserved.  The file named COPYRIGHT specifies the terms 
  855. X# and conditions for redistribution.
  856. X
  857. X
  858. X#
  859. X# $Id: tester,v 8.2 1993/03/17 18:53:40 panos Exp $
  860. X#
  861. X
  862. X#
  863. X# Usage:
  864. X#            tester [all] [function-name function-name ...]
  865. X#
  866. X# function-name is the name of a sio function (or macro)
  867. X#
  868. X# If "all" is used, functions after it will *not* be tested.
  869. X#
  870. X
  871. Xscript_name=`basename $0`
  872. X
  873. Xcopy_file=/usr/dict/words
  874. Xtemp_file=/tmp/w
  875. Xmake_log=MAKE.LOG
  876. X
  877. Xif test ! -f $copy_file ; then
  878. X    echo "The file '$copy_file' is not available."
  879. X    echo "Please edit the '$script_name' script and change set the"
  880. X    echo "variable 'copy_file' to the name of a publicly readable file"
  881. X    echo "with at least a few tens of thousands of lines."
  882. X    exit 1
  883. Xfi
  884. X
  885. Xtrap_function()
  886. X{
  887. X    rm -f $temp_file $make_log
  888. X    echo
  889. X    exit 1
  890. X}
  891. X
  892. X
  893. Xmake_program()
  894. X{
  895. X    target=$1
  896. X    cflags="$2"
  897. X    if test -f $1 -a ! -x $1 ; then rm -f $1 ; fi
  898. X    if test "$cflags"
  899. X    then
  900. X        make -s "$cflags" $target >$make_log 2>&1
  901. X    else
  902. X        make -s $target >$make_log 2>&1
  903. X    fi
  904. X    exit_code=$?
  905. X    if test $exit_code -eq 0 -a -x $1
  906. X    then
  907. X        rm -f $make_log
  908. X    else
  909. X        echo "FAILED"
  910. X        echo "   The make failed. Check the make log file << $make_log >>"
  911. X        exit
  912. X    fi
  913. X}
  914. X
  915. X
  916. X
  917. X#
  918. X# test_function expects a single argument, the name of the function
  919. X# it will test.
  920. X# It creates a program that has the name of the function by invoking
  921. X# make with the symbol -DTEST_<function_name>
  922. X#
  923. Xtest_function()
  924. X{
  925. X    expression="echo $"$1
  926. X    var=`eval $expression`
  927. X    if test "$var" = "no" -o "$var" = "" -a "$all" = "no" ; then return ; fi
  928. X
  929. X    echo -n "TESTING $1 "
  930. X    make_program $1 "CFLAGS=-g -DTEST_$1"
  931. X
  932. X    ./$1 < $copy_file >$temp_file
  933. X    exit_code=$?
  934. X    if test $exit_code -ne 0
  935. X    then
  936. X        echo "FAILED"
  937. X        echo "   Test program exited with exit code $exit_code"
  938. X        echo "   Temporary file << $temp_file >> not deleted"
  939. X        exit
  940. X    fi
  941. X    cmp -s $copy_file $temp_file
  942. X    if test $? -ne 0
  943. X    then
  944. X        echo "FAILED"
  945. X        echo "   The files << $copy_file >> and << $temp_file >> are not the same"
  946. X        exit
  947. X    else
  948. X        echo PASSED
  949. X    fi
  950. X    rm -f $temp_file
  951. X}
  952. X
  953. X
  954. Xtest_sprint()
  955. X{
  956. X    var=$Sprint
  957. X    program=Sprint
  958. X    if test "$var" = "no" -o "$var" = "" -a "$all" = "no" ; then return ; fi
  959. X
  960. X    echo TESTING Sprint
  961. X    make_program $program ""
  962. X    $TESTSHELL sprint_test
  963. X}
  964. X
  965. X
  966. Xtest_smorefds()
  967. X{
  968. X    var=$Smorefds
  969. X    program=fdtest
  970. X    if test "$var" = "no" -o "$var" = "" -a "$all" = "no" ; then return ; fi
  971. X
  972. X    echo -n "TESTING Smorefds "
  973. X    make_program $program "CFLAGS=-g"
  974. X    v=`fdtest 2>&1`
  975. X    if test $? -eq 0 ; then
  976. X        echo PASSED
  977. X    else
  978. X        echo "FAILED: $v"
  979. X    fi
  980. X}
  981. X
  982. X
  983. Xtrap trap_function 1 2 3 15
  984. X
  985. X#
  986. X# There is a variable for every function to be tested. That variable
  987. X# can have the values "yes", "no" or "".
  988. X# When a function is specified, it takes the value of $run. Initially $run 
  989. X# is "yes", so a specified function has its variable set to "yes". 
  990. X# If "all" is specified, $run becomes "no", so subsequently specified
  991. X# functions, have their variables set to "no".
  992. X#
  993. X# We test a function iff:
  994. X#        its variable is "yes" OR its variable is "" and $all is "yes"
  995. X# We don't test a function iff:
  996. X#        its variable is "no" OR its variable is "" and $all is "no"
  997. X#        
  998. X# Therefore, all functions specified after "all" will NOT be tested.
  999. X#
  1000. Xrun=yes
  1001. Xall=no
  1002. X
  1003. Xwhile test $# -gt 0
  1004. Xdo
  1005. X    case $1 in
  1006. X        Sputchar)    Sputchar=$run ;;
  1007. X        Sgetchar)    Sgetchar=$run ;;
  1008. X        Srdline)        Srdline=$run ;;
  1009. X        Sfetch)        Sfetch=$run ;;
  1010. X        Sread)        Sread=$run ;;
  1011. X        Swrite)        Swrite=$run ;;
  1012. X        Sgetc)        Sgetc=$run ;;
  1013. X        Sputc)        Sputc=$run ;;
  1014. X        Sflush)        Sflush=$run ;;
  1015. X        Sundo)        Sundo=$run ;;
  1016. X        Sprint)        Sprint=$run ;;
  1017. X        switch)        switch=$run ;;
  1018. X        switch2)        switch2=$run ;;
  1019. X        Smorefds)    Smorefds=$run ;;
  1020. X        all)            all=yes ; run="no" ;;
  1021. X        *) echo Bad argument: $1
  1022. X    esac
  1023. X    shift
  1024. Xdone
  1025. X
  1026. Xtest_function Sgetchar
  1027. Xtest_function Sputchar
  1028. Xtest_function Sread
  1029. Xtest_function Swrite
  1030. Xtest_function Srdline
  1031. Xtest_function Sfetch
  1032. Xtest_function Sgetc
  1033. Xtest_function Sputc
  1034. Xtest_function Sflush
  1035. Xtest_function Sundo
  1036. Xtest_function switch
  1037. Xtest_function switch2
  1038. Xtest_smorefds
  1039. Xtest_sprint
  1040. X
  1041. END_OF_FILE
  1042. if test 3971 -ne `wc -c <'libs/src/sio/suite/tester'`; then
  1043.     echo shar: \"'libs/src/sio/suite/tester'\" unpacked with wrong size!
  1044. fi
  1045. # end of 'libs/src/sio/suite/tester'
  1046. fi
  1047. if test -f 'libs/src/str/strparse.3' -a "${1}" != "-c" ; then 
  1048.   echo shar: Will not clobber existing file \"'libs/src/str/strparse.3'\"
  1049. else
  1050. echo shar: Extracting \"'libs/src/str/strparse.3'\" \(4131 characters\)
  1051. sed "s/^X//" >'libs/src/str/strparse.3' <<'END_OF_FILE'
  1052. X.\"(c) Copyright 1992, 1993 by Panagiotis Tsirigotis
  1053. X.\"All rights reserved.  The file named COPYRIGHT specifies the terms 
  1054. X.\"and conditions for redistribution.
  1055. X.\"
  1056. X.\" $Id: strparse.3,v 2.1 1993/01/13 22:37:58 panos Exp $
  1057. X.TH STRPARSE 3X "30 September 1992"
  1058. X.SH NAME
  1059. Xstr_parse, str_endparse, str_component, str_separator, str_nextpos
  1060. X.SH SYNOPSIS
  1061. X.LP
  1062. X.nf
  1063. X.ft B
  1064. X#include "str.h"
  1065. X.LP
  1066. X.ft B
  1067. Xstr_h str_parse( str, separ, flags, errnop )
  1068. Xchar *str ;
  1069. Xchar *separ ;
  1070. Xint flags ;
  1071. Xint *errnop ;
  1072. X.LP
  1073. X.ft B
  1074. Xvoid str_endparse( handle )
  1075. Xstr_h handle ;
  1076. X.LP
  1077. X.ft B
  1078. Xchar *str_component( handle )
  1079. Xstr_h handle ;
  1080. X.LP
  1081. X.ft B
  1082. Xint str_setstr( handle, newstr )
  1083. Xstr_h handle ;
  1084. Xchar *newstr ;
  1085. X.LP
  1086. X.ft B
  1087. Xint str_separator( handle, separ )
  1088. Xstr_h handle ;
  1089. Xchar *separ ;
  1090. X.LP
  1091. X.ft B
  1092. Xchar *str_nextpos( handle )
  1093. Xstr_h handle ;
  1094. X.LP
  1095. Xextern int str_errno ;
  1096. X.SH DESCRIPTION
  1097. X.LP
  1098. XThese functions are useful for parsing strings.
  1099. XIn this context parsing means breaking
  1100. Xthe string into substrings. The substrings are separated by a list
  1101. Xof possible separator characters.
  1102. X.LP
  1103. X.B str_component()
  1104. Xreturns successive substrings of the string.
  1105. X.B str_parse()
  1106. Xcreates and initializes a string parser with the string
  1107. Xthat will be processed, \fIstr\fR, the list of possible separator
  1108. Xcharacters, \fIsepar\fR, and flags that control how the parser
  1109. Xworks. The \fIflags\fR argument is formed by ORing one or more of
  1110. Xthe following constants:
  1111. X.TP 20
  1112. X.SB STR_RETURN_ERROR
  1113. XIf something goes wrong return a value that indicates that an error occured
  1114. X(e.g. out of memory). The default is for the program to be terminated
  1115. Xwith an appropriate error message.
  1116. X.TP
  1117. X.SB STR_NULL_START
  1118. XIf \fIstr\fR starts with a separator then a zero-length string will be returned
  1119. Xthe first time \fBstr_component()\fR is called.
  1120. X.TP
  1121. X.SB STR_NULL_END
  1122. XIf \fIstr\fR starts with a separator then a zero-length string will be returned
  1123. Xby \fBstr_component()\fR when the substrings of \fIstr\fR are exhausted.
  1124. X.TP
  1125. X.SB STR_MALLOC
  1126. XThe strings returned by \fBstr_component()\fR will be in malloc'ed memory.
  1127. XBy default the substrings are part of \fIstr\fR.
  1128. XIf this option is not used \fIstr\fR will be modified
  1129. Xby \fBstr_component()\fR.
  1130. X.LP
  1131. XFinally, \fBSTR_NOFLAGS\fR may be used to specify no flags.
  1132. XThe \fIerrnop\fR argument points to an integer where the string processing
  1133. Xfunctions will deposit an error code if an error occurs.
  1134. XIf \fIerrnop\fR
  1135. Xis
  1136. X.SM NULL
  1137. Xthe error codes will be placed in \fIstr_errno\fR.
  1138. XThis is useful only if \fBSTR_RETURN_ERROR\fR is used in \fIflags\fR.
  1139. XIt is possible that \fIstr\fP is 
  1140. X.SM NULL.
  1141. XIn this case, a subsequent
  1142. X.B str_setstr()
  1143. Xshould be used to specify the string to be processed.
  1144. X.LP
  1145. X.B str_component()
  1146. Xreturns successive substrings from the string associated with the
  1147. Xparser specified by \fIhandle\fR.
  1148. X.LP
  1149. X.B str_endparse()
  1150. Xdestroys the parser specified by \fIhandle\fR.
  1151. X.LP
  1152. X.B str_setstr()
  1153. Xchanges the processed string to \fInewstr\fP.
  1154. X.LP
  1155. X.B str_separator()
  1156. Xreplaces the list of separator characters with \fIsepar\fR.
  1157. XProcessing continues from the current position.
  1158. X.LP
  1159. X.B str_nextpos()
  1160. Xreturns a pointer to the rest of the string. The previous character
  1161. Xis a separator character (if \fBSTR_MALLOC\fR is not set, then the
  1162. Xprevious character is
  1163. X.SM NUL
  1164. X).
  1165. X.SH "RETURN VALUES"
  1166. X.LP
  1167. X.B str_parse()
  1168. Xreturns a parser handle or
  1169. X.SM NULL
  1170. Xif something goes wrong and \fIflags\fR & \fBSTR_RETURN_ERROR\fR is true.
  1171. XPossible \fIstr_errno\fR values:
  1172. X.RS
  1173. X.TP 20
  1174. X.SB STR_ENULLSEPAR
  1175. X\fIsepar\fR is
  1176. X.SM NULL
  1177. X.TP
  1178. X.SB STR_ENOMEM
  1179. Xthe program ran out of memory
  1180. X.RE
  1181. X.LP
  1182. X.B str_component()
  1183. Xreturns a pointer to the next substring or
  1184. X.SM NULL
  1185. Xif something goes wrong and \fIflags\fR & \fBSTR_RETURN_ERROR\fR is true.
  1186. X.LP
  1187. X.B str_setstr()
  1188. Xreturns 
  1189. X.SB STR_OK
  1190. Xon success or
  1191. X.SB STR_ERR
  1192. Xon failure.
  1193. X.LP
  1194. X.B str_separator()
  1195. Xreturns 
  1196. X.SB STR_OK
  1197. Xon success or
  1198. X.SB STR_ERR
  1199. Xon failure.
  1200. X.LP
  1201. X.B str_nextpos()
  1202. Xreturns a pointer or
  1203. X.SM NULL
  1204. Xif the end of string has been reached.
  1205. X.SH BUGS
  1206. X.B str_component()
  1207. Xmodifies the string unless \fBSTR_MALLOC\fR is
  1208. Xset in the parser.
  1209. X.LP
  1210. XThere should be only one parser active on a specific string. If there
  1211. Xis more than
  1212. Xone, they all must use the \fBSTR_MALLOC\fR option.
  1213. X
  1214. END_OF_FILE
  1215. if test 4131 -ne `wc -c <'libs/src/str/strparse.3'`; then
  1216.     echo shar: \"'libs/src/str/strparse.3'\" unpacked with wrong size!
  1217. fi
  1218. # end of 'libs/src/str/strparse.3'
  1219. fi
  1220. if test -f 'libs/src/str/strs.3' -a "${1}" != "-c" ; then 
  1221.   echo shar: Will not clobber existing file \"'libs/src/str/strs.3'\"
  1222. else
  1223. echo shar: Extracting \"'libs/src/str/strs.3'\" \(3633 characters\)
  1224. sed "s/^X//" >'libs/src/str/strs.3' <<'END_OF_FILE'
  1225. X.\"(c) Copyright 1992, 1993 by Panagiotis Tsirigotis
  1226. X.\"All rights reserved.  The file named COPYRIGHT specifies the terms 
  1227. X.\"and conditions for redistribution.
  1228. X.\"
  1229. X.\" $Id: strs.3,v 2.2 1993/04/01 23:01:41 panos Exp $
  1230. X.TH STRS 3X "10 January 1993"
  1231. X.SH NAME
  1232. Xstrs_setup, strs_match, strs_done, strs_search - string matching functions
  1233. X.SH SYNOPSIS
  1234. X.LP
  1235. X.nf
  1236. X.ft B
  1237. X#include "str.h"
  1238. X.LP
  1239. X.ft B
  1240. Xstrs_h strs_setup( flags, pattern )
  1241. Xint flags ;
  1242. Xchar *pattern ;
  1243. X.LP
  1244. X.ft B
  1245. Xchar *strs_match( handle, str, len )
  1246. Xstrs_h handle ;
  1247. Xchar *str ;
  1248. Xint len ;
  1249. X.LP
  1250. X.ft B
  1251. Xvoid strs_done( handle )
  1252. Xstrs_h handle ;
  1253. X.LP
  1254. X.ft B
  1255. Xchar *strs_search( flags, str, len, pattern )
  1256. Xint flags ;
  1257. Xchar *str ;
  1258. Xint len ;
  1259. Xchar *pattern ;
  1260. X.SH DESCRIPTION
  1261. X.LP
  1262. XThese functions perform string matching. They have been designed with
  1263. Xthe assumption that one needs to find a certain pattern in a set of
  1264. Xstrings. It is also possible to use them to find if a pattern occurs
  1265. Xin a specific string.
  1266. X.LP
  1267. X.B strs_setup()
  1268. Xis used to specify the pattern to look for. It returns a
  1269. X.I handle
  1270. Xwhich is used in subsequent string matching operations against
  1271. Xthe specified
  1272. X.I pattern.
  1273. XThe
  1274. X.I flags
  1275. Xargument has two parts: a search method and generic flags.
  1276. XThe available search methods include the following algorithms:
  1277. X.RS
  1278. X.TP 15
  1279. X.SB STRS_BF
  1280. Xbrute force algorithm (also called naive in the literature). 
  1281. X.TP
  1282. X.SB STRS_RK
  1283. XRabin-Karp algorithm (probabilistic).
  1284. X.TP
  1285. X.SB STRS_KMP
  1286. XKnuth-Morris-Pratt algorithm.
  1287. X.TP
  1288. X.SB STRS_SBM
  1289. XSimple Boyer-Moore (uses only the last occurrence heuristic).
  1290. X.TP
  1291. X.SB STRS_BMH
  1292. XThis is the Boyer-Moore algorithm using the last occurrence heuristic
  1293. Xas modified by Horspool (this is faster than the simple Boyer-Moore).
  1294. X.RE
  1295. X.LP
  1296. XThe default algorithm is the brute force method.
  1297. XIn practice, the fastest algorithm is the
  1298. XBoyer-Moore-Horspool one.
  1299. X.LP
  1300. XThe flags that can be specified include:
  1301. X.RS
  1302. X.TP 15
  1303. X.SB STRS_NOMALLOC
  1304. Xdo not allocate space for the pattern. This can be specified if
  1305. Xthe pattern space will be available during the matching phase
  1306. X(i.e. do not use this flag if the pattern space was malloc'ed and
  1307. Xyou free it before doing any matching).
  1308. X.TP
  1309. X.SB STRS_IGNCASE
  1310. Xperform case-insensitive string matching
  1311. X(the default is case-sensitive matching).
  1312. X.RE
  1313. X.LP
  1314. X.B strs_match()
  1315. Xtries to match the string specified by
  1316. X.I str
  1317. Xagainst the pattern identified by
  1318. X.I handle.
  1319. XSince the length of the string is given by the
  1320. X.I len
  1321. Xargument the string does not need to be NUL-terminated.
  1322. X.B strs_done()
  1323. Xshould be invoked after all matching against the pattern identified by
  1324. X.I handle
  1325. Xis done.
  1326. X.LP
  1327. X.B strs_search()
  1328. Xis equivalent to:
  1329. X.LP
  1330. X.PD .1v
  1331. X.nf
  1332. X.RS
  1333. Xh = strs_setup( flags, pattern ) ;
  1334. Xp = strs_match( h, str, len ) ;
  1335. Xstrs_done( h ) ;
  1336. Xreturn( p ) ;
  1337. X.RE
  1338. X.PD
  1339. X.SH "RETURN VALUES"
  1340. X.LP
  1341. X.B strs_setup()
  1342. Xreturns a search handle on success or
  1343. X.SM NULL
  1344. Xon failure.
  1345. X.LP
  1346. X.B strs_match()
  1347. Xand
  1348. X.B strs_search()
  1349. Xreturn a pointer to the first occurrence of the pattern in the string or
  1350. X.SM NULL
  1351. Xif the pattern does not occur in the string.
  1352. X.SH "SEE ALSO"
  1353. XDonald E. Knuth, James H. Morris, Vaughan R. Pratt.
  1354. XFast pattern matching in strings.
  1355. XSIAM Journal on Computing, 6(2):323-350, 1977.
  1356. X.LP
  1357. XRichard M. Karp, Michael O. Rabin.
  1358. XEfficient randomized pattern-matching algorithms.
  1359. XTechnical Report TR-31-81,
  1360. XAiken Computation Laboratory, Harvard University, 1981.
  1361. X.LP
  1362. XRobert S. Boyer, J. Strother Moore.
  1363. XA fast string-searching algorithm.
  1364. XCommunications of the ACM, 20(10):762-772, 1977.
  1365. X.LP
  1366. XN. Horspool.
  1367. XPractical fast searching in strings.
  1368. XSoftware - Practice and Experience, 10:501-506, 1980.
  1369. X.LP
  1370. XThomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest.
  1371. XIntroduction to Algorithms.
  1372. XMcGraw-Hill 1990.
  1373. END_OF_FILE
  1374. if test 3633 -ne `wc -c <'libs/src/str/strs.3'`; then
  1375.     echo shar: \"'libs/src/str/strs.3'\" unpacked with wrong size!
  1376. fi
  1377. # end of 'libs/src/str/strs.3'
  1378. fi
  1379. echo shar: End of archive 5 \(of 12\).
  1380. cp /dev/null ark5isdone
  1381. MISSING=""
  1382. for I in 1 2 3 4 5 6 7 8 9 10 11 12 ; do
  1383.     if test ! -f ark${I}isdone ; then
  1384.     MISSING="${MISSING} ${I}"
  1385.     fi
  1386. done
  1387. if test "${MISSING}" = "" ; then
  1388.     echo You have unpacked all 12 archives.
  1389.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1390. else
  1391.     echo You still need to unpack the following archives:
  1392.     echo "        " ${MISSING}
  1393. fi
  1394. ##  End of shell archive.
  1395. exit 0
  1396. ------------------------------ Cut here ------------------------------
  1397.  
  1398. -- 
  1399. Panos Tsirigotis, CS grad                        
  1400. Pmail: Computer Science Dept., U. of Colorado @ Boulder, Boulder, CO 80309-0430
  1401. Email: panos@cs.colorado.edu
  1402.