amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (05/18/91)
Submitted-by: "J. Spencer" <bhgs@utcs.utoronto.ca> Posting-number: Volume 91, Issue 107 Archive-name: libraries/sregexp-9.4/part01 [ includes uuencoded libraries ...tad ] 'sregexp.library' is a run time library of routines for doing wildcard pattern matching and wildcard path matching. It accepts a slight extension of the AmigaDOS wildcard syntax, including a not operator, and character sets. It has routines to test if a string matches a wildcard expression, and for scanning through all matches to a wildcarded AmigaDOS path. There are two nifty features to the path matching routines: '.../' means recursively scan all subdirectories, and may come anywhere in the path; and wildcards are allowed in the volume node part of the path! (DH?: would match all your hard drive partitions.) #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 2)." # Contents: BUGS_TO COPYRIGHT.NOTICE OVERVIEW clibrary.asm # compilation.notes dmakefile instillation.notes kludge.asm # revision.history spath.c sreg_version.c sreg_version.i sregexp.fd # sregexp.h sregexp.uu sregexp_protos.h sregexpbase.h sregexpbase.i # sregexps.uu sregexpsr.uu utils utils/bumprev.c utils/remlib.c # utils/try.c # Wrapped by tadguy@ab20 on Fri May 17 21:56:58 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'BUGS_TO' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'BUGS_TO'\" else echo shar: Extracting \"'BUGS_TO'\" \(94 characters\) sed "s/^X//" >'BUGS_TO' <<'END_OF_FILE' X XSend bug reports, comments, etc. to X X Jon Spencer. X X EMail: bhgs@gpu.utcs.utoronto.ca X END_OF_FILE if test 94 -ne `wc -c <'BUGS_TO'`; then echo shar: \"'BUGS_TO'\" unpacked with wrong size! fi # end of 'BUGS_TO' fi if test -f 'COPYRIGHT.NOTICE' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'COPYRIGHT.NOTICE'\" else echo shar: Extracting \"'COPYRIGHT.NOTICE'\" \(1083 characters\) sed "s/^X//" >'COPYRIGHT.NOTICE' <<'END_OF_FILE' X X The library 'sregexp.library', and all sources and documentation X relating to it included in this distribution are Copyright (c) 1991, by X Jon Spencer. X X Permission is given to redistribute any part or all of this X distribution, either modified or unmodified, PROVIDED THAT: X - the distribution is on a not-for-profit basis, X - this copyright notice is included in the distribution, X - and if a modified version is distributed, clear indication X that it is modified is included. X X All other rights are reserved by the author, Jon Spencer. X X X(disclaimer borrowed, somewhat modified, from the DICE distribution) X X PROGRAM DISCLAIMER: THE LIBRARY IS PROVIDED "AS IS" WITHOUT WARRANTY OF X ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, X THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR X PURPOSE. THE ENTIRE RISK AS TO THE RESULTS AND PERFORMANCE OF ANY X PROGRAM IS ASSUMED BY YOU. Should the program prove defective, you X assume the entire cost of all necessary servicing, repair, or X correction. X END_OF_FILE if test 1083 -ne `wc -c <'COPYRIGHT.NOTICE'`; then echo shar: \"'COPYRIGHT.NOTICE'\" unpacked with wrong size! fi # end of 'COPYRIGHT.NOTICE' fi if test -f 'OVERVIEW' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'OVERVIEW'\" else echo shar: Extracting \"'OVERVIEW'\" \(622 characters\) sed "s/^X//" >'OVERVIEW' <<'END_OF_FILE' X X'sregexp.library' is a run time library of routines for doing wildcard Xpattern matching and wildcard path matching. It accepts a slight extension Xof the AmigaDOS wildcard syntax, including a not operator, and character Xsets. It has routines to test if a string matches a wildcard expression, Xand for scanning through all matches to a wildcarded AmigaDOS path. There Xare two nifty features to the path matching routines: '.../' means Xrecursively scan all subdirectories, and may come anywhere in the path; and Xwildcards are allowed in the volume node part of the path! (DH?: would Xmatch all your hard drive partitions.) END_OF_FILE if test 622 -ne `wc -c <'OVERVIEW'`; then echo shar: \"'OVERVIEW'\" unpacked with wrong size! fi # end of 'OVERVIEW' fi if test -f 'clibrary.asm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'clibrary.asm'\" else echo shar: Extracting \"'clibrary.asm'\" \(11630 characters\) sed "s/^X//" >'clibrary.asm' <<'END_OF_FILE' X X;************************************************************************** X;* * X;* sregexp.library -- pattern matching run time library. * X;* * X;* * X;* Startup module: this is heavily copied from the sample.library * X;* in the RKM includes and autodocs. * X;* This also relies on some features of dice (in particular, registered * X;* args and features of the linker.) Be carefull if you make it with * X;* something else. * X;* * X;* Created: April 20, 1991 * X;* * X;************************************************************************** X X CODE sregexp.start X X INCLUDE "sregexpbase.i" X INCLUDE "exec/initializers.i" X INCLUDE "libraries/dos.i" X INCLUDE "exec/resident.i" X INCLUDE "exec/lists.i" X INCLUDE "exec/alerts.i" X INCLUDE "sreg_version.i" X X;-------------------------------------------------------------------- X; some generally usefull macros hiding _LVO's X;-------------------------------------------------------------------- XCALLSYS macro X jsr _LVO\1(a6) X endm X XXLIB macro X xref _LVO\1 X endm X X;-------------------------------------------------------------------- X; Declare the library calls I use. The _LVO's are brought in X; from amiga.lib X;-------------------------------------------------------------------- X XLIB OpenLibrary X XLIB CloseLibrary X XLIB Alert X XLIB FreeMem X XLIB Remove X X;------ defined in Amiga.lib ------ X xref _AbsExecBase X X;------ defined in the c source, the id string of my library. ------ X xref _idString X X X X X;-------------------------------------------------------------------- X; Make some stuff visible for debuging. X;-------------------------------------------------------------------- X xdef Init X xdef EndCode X xdef RomTag X xdef funcTable X xdef dataTable X xdef InitRoutine X X xdef Open X xdef Close X xdef Expunge X xdef Reserved X X;-------------------------------------------------------------------- X; The links to the c code are in the file kludge.asm, because the X; assembler I use doesn't like to make symbols starting with a @. X; But thats what DICE starts it's regargs routines with, so... X; I make the links with das, which comes with dice. X; X; my library routines X;-------------------------------------------------------------------- X xref parsesregexp X xref freesregexp X xref matchsregexp X xref matchnsregexp X xref iswild X xref anchorpath X xref nextfile X xref buildpath X xref freespathinfo X X X X X X************************************************************************ X* Ok, so much for the preamble, we can actually start to generate * X* some code now. The very first thing we should do is return an * X* error if someone tries to run us like a program, seeing as we * X* will be a perfectly legal AmigaDos load module. * X************************************************************************ X XStart: X moveq.l #-1,d0 X rts X X X;-------------------------------------------------------------------- X; Ok, here's what exec is going to look for to tell it that we are X; a library. X;-------------------------------------------------------------------- XRomTag: X dc.w RTC_MATCHWORD ; magic X dc.l RomTag ; pointer back to magic X dc.l EndCode ; keep looking from here X dc.b RTF_AUTOINIT ; yes, autoinit me. X dc.b VERSION ; version number X dc.b NT_LIBRARY ; I'm a library X dc.b 0 ; no priority (typical) X dc.l sregexpname ; I have a name X dc.l _idString ; let's see some ID X dc.l Init ; start me up X X X;-------------------------------------------------------------------- X; Ok, heres the table of 4 vectors exec is going to look for X; to autoinit me. X; X; We are word alligned here. X;-------------------------------------------------------------------- XInit: X dc.l SregExpBase_SIZE ; size of library structure X dc.l funcTable ; table of all my routines. X dc.l dataTable ; LibStructure init data X dc.l InitRoutine ; Where to start me. X X X;-------------------------------------------------------------------- X; This is the list of functions in my library. X;-------------------------------------------------------------------- XfuncTable: X dc.l Open X dc.l Close X dc.l Expunge X dc.l Reserved X X; my own little gems. X dc.l parsesregexp X dc.l freesregexp X dc.l matchsregexp X dc.l matchnsregexp X dc.l iswild X dc.l anchorpath X dc.l nextfile X dc.l buildpath X dc.l freespathinfo X dc.l -1 ; end of the list. X X;-------------------------------------------------------------------- X; heres the stuff to initialise my Library structure. X;-------------------------------------------------------------------- XdataTable: X INITBYTE LN_TYPE,NT_LIBRARY X INITLONG LN_NAME,sregexpname X INITBYTE LIB_FLAGS,LIBF_SUMUSED|LIBF_CHANGED X INITWORD LIB_VERSION,VERSION X INITWORD LIB_REVISION,REVISION X INITLONG LIB_IDSTRING,_idString X dc.l 0 X X X X******************************************************************* X* Ok, so now were really ready to get cooking. * X* This routine is called when the library is first linked into * X* the exec LibList. The Library structure has already been * X* initialised as per the dataTable instructions. * X* * X* When called, d0 has our library base and the segment list is * X* pointed to by a0; a6 is a pointer to SysBase. * X******************************************************************* X XInitRoutine: X move.l a4,-(sp) ; put the lib pointer X move.l d0,a4 ; in a convinient place X X move.l a6,sb_SysBase(a4) ; save SysBase X move.l a0,sb_SegList(a4) ; save our seglist X X lea.l dosname(pc),a1 ; try and open up X moveq.l #0,d0 ; dos.library X CALLSYS OpenLibrary X X move.l d0,sb_DOSBase(a4) ;save dos X bne.s 1$ X X X ALERT AG_OpenLib|AO_DOSLib ; couldn't get dos!!! X X;------- That's all there is to do. -------- X1$ X move.l a4,d0 X move.l (sp)+,a4 X rts X X X X*********************************************************************** X* So good so far. Now come the 4 standard library routines that * X* every good library must have. Each of these (in fact all of the * X* library calls) comes with the pointer to our library base in a6. * X*********************************************************************** X X;---------------------------------------------------------------------- X; To open the library, all we have to do is up the count of current X; users and reset the delayed expunge flag. This returns the library X; pointer on d0 if we successfully opened (which is always the case). X;---------------------------------------------------------------------- XOpen: X addq.w #1,LIB_OPENCNT(a6) X bclr #LIBB_DELEXP,LIB_FLAGS(a6) X move.l a6,d0 X rts X X X X X;---------------------------------------------------------------------- X; When we close the library, we decrease the count of current X; users. If this has reached zeros, then we check the delayed X; expunge flag and clean up if it is set. X; If this routine returns 0 then that's that. If the return value X; is non-zero, it should be the segment pointer passed to the X; initialization routine, so we can be unloaded. X;---------------------------------------------------------------------- XClose: X ;--- set up the return value, which will be altered --- X ;--- if we decide to do a delayed expunge. --- X moveq.l #0,d0 X subq.w #1,LIB_OPENCNT(a6) X bne.s 1$ X btst #LIBB_DELEXP,LIB_FLAGS(a6) X beq.s 1$ X X; --- take a shortcut into the Expunge routine that doesn't --- X; --- redo the tests we just did. --- X bsr.s ReallyExpunge X X1$ X; --- at this point, d0 is zero if we didn't expunge, otherwise --- X; --- it the address of our segment list. --- X rts X X X X;---------------------------------------------------------------------- X; Ok, so now we want to try to unload. First check if there X; are still any current openers, if so, just set the delayed X; expunge flag, and we'll go away when everyone closes us. X; Otherwise, clean up my resources and return the seg list to X; be unloaded X;---------------------------------------------------------------------- XExpunge: X tst.w LIB_OPENCNT(a6) X beq.s ReallyExpunge X X bset #LIBB_DELEXP,LIB_FLAGS(a6) X moveq.l #0,d0 ;don't unload me please X rts X XReallyExpunge: X movem.l d2/a5,-(sp) X move.l a6,a5 X move.l sb_SysBase(a5),a6 X X move.l sb_SegList(a5),d2 ;save seglist. X X move.l a5,a1 ;remove the library X REMOVE ;from the system list X X move.l sb_DOSBase(a5),a1 X CALLSYS CloseLibrary ;close dos. X X moveq.l #0,d0 X move.l a5,a1 X move.w LIB_NEGSIZE(a5),d0 X sub.l d0,a1 X add.w LIB_POSSIZE(a5),d0 X X CALLSYS FreeMem ;free our library base. X X move.l d2,d0 ;unload us. X X movem.l (sp)+,d2/a5 X rts X X X;---------------------------------------------------------------------- X; This is the reserved vector. Just return 0. X;---------------------------------------------------------------------- XReserved: X moveq.l #0,d0 X rts X X X X********************************************************************** X* That's all of the standard stuff. As discussed above, the links * X* to the c code are in the file kludge.asm * X********************************************************************** X X X X X X X X;---------------------------------------------------------------------- X; Here are some stings used in the above. I put them at the end so X; so I don't have to worry about alignment. X;---------------------------------------------------------------------- Xdosname DOSNAME X Xsregexpname SREGEXPNAME X X;---------------------------------------------------------------------- X; The end of the code, where exec can start looking for more RomTag X; structures if it wants to. X;---------------------------------------------------------------------- X EVEN XEndCode: X X X X X X********************************************************************** X* * X* Now comes the clever part. Dice (and the others, I think) * X* references there global data from register a4. What I do * X* to have easy access to the Library structure data from the * X* c code, is transfer a6 to a4 on each library call and then * X* define the various things I want to access as offsets to * X* this, in effect, tricking dice into thinking they're global * X* variables. The real benifit of this is I don't need my own * X* custom links to the Exec and DOS library routines, because * X* there exists perfectly valid global variables SysBase and * X* DosBase. * X* * X********************************************************************** X X DATA data X X;--------------------------------------------------------------------- X; This one is a little funny, it is the actual instance of the X; structure, and not a pointer to it. It should be declared in X; the c code as 'extern struct SregExpBase SregExpBase;' and then X; referenced with the '.' and not the '->'. This may not work X; I haven't tried it yet. X;---------------------------------------------------------------------- X_SregExpBase equ 0 X xdef _SregExpBase X X;--- These are perfectly ordinary pointers --- X_SysBase equ sb_SysBase X xdef _SysBase X X_DOSBase equ sb_DOSBase X xdef _DOSBase X X end X END_OF_FILE if test 11630 -ne `wc -c <'clibrary.asm'`; then echo shar: \"'clibrary.asm'\" unpacked with wrong size! fi # end of 'clibrary.asm' fi if test -f 'compilation.notes' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'compilation.notes'\" else echo shar: Extracting \"'compilation.notes'\" \(1301 characters\) sed "s/^X//" >'compilation.notes' <<'END_OF_FILE' X X X As it says in various places in the source, this whole thing is kind X of DICE dependent. If you know what you are doing you should be X able to get it to compile under anything. X X The c source was not written with an eye to portability, but I don't X think it is too bad. X X To make under another compiler you will almost definitely have to change X the file kludge.asm, were the jump vectors into the code are. Most X likely you'll have to take the register parameters and stuff X them onto the stack. X X The easiest thing to do is just type 'dmake install' and trust X my compilations. X X PLEASE do not distribute modified versions, and if you do make sure X the copyright notice is left intact AND you state clearly it is X a modified version. X X X Note that I made everything under 1.3 (I don't have 2.0). There X are a few things to consider, however. I have made my own 1.3 version X of the 'clib' directory, which is new to 2.0. This also allowed X me to make my own 1.3 registered args amigasr13.lib linker X library. If you want to remake this under 1.3 with dice, you will X have to either come up with these yourself, or modify kludge.asm X to stuff the parameters on to the stack. Under 2.0 everything should X go, but no guarantees. X END_OF_FILE if test 1301 -ne `wc -c <'compilation.notes'`; then echo shar: \"'compilation.notes'\" unpacked with wrong size! fi # end of 'compilation.notes' fi if test -f 'dmakefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'dmakefile'\" else echo shar: Extracting \"'dmakefile'\" \(1467 characters\) sed "s/^X//" >'dmakefile' <<'END_OF_FILE' X XOD = OBJS:sreg/ X XCSRC = sregexp.c sreg_version.c spath.c XCOBJ = $(CSRC:"*.c":"$(OD)*.o") XOBJ = $(OD)clibrary.o $(OD)kludge.o $(COBJ) XJUNK = utils/try utils/remlib utils/bumprev XJUNKSRC = $(JUNK:"*":"*.c") X XLINKLIBS = amigasr13.lib cr.lib X XLIBRARY = sregexp.library X XCOPTS = -c -mRR -mS -proto X#COPTS = -c -mRR -mS -proto -D __DEBUG__ X Xall : sregexpsr.lib sregexps.lib $(JUNK) $(LIBRARY) X X$(JUNK) : $(JUNKSRC) X dcc -mRR -r -lsregexpsr -o %(left) %(right) X X$(LIBRARY) : $(OBJ) X -Delete >NIL: %(left) X dlink -o %(left) $(OBJ) $(LINKLIBS) X utils/remlib $(LIBRARY) X Protect %(left) -E X X$(OD)clibrary.o : clibrary.asm sreg_version.i X -Delete >NIL: %(left) X a68k -q -iAINC: -o%(left) clibrary.asm X X$(OD)kludge.o : kludge.asm X -Delete >NIL: %(left) X das -o%(left) %(right) X X$(COBJ) : $(CSRC) X -Delete >NIL: %(left) X dcc $(COPTS) -o %(left) %(right) X Xsregexpsr.lib : sregexp.fd sregexp_protos.h X -Delete >NIL: %(left) X fdtolib -mr sregexp.fd -o %(left) -h sregexp_protos.h X Xsregexps.lib : sregexp.fd X -Delete >NIL: %(left) X fdtolib sregexp.fd -o %(left) X Xsreg_version.i : $(CSRC) clibrary.asm kludge.asm utils/bumprev X utils/bumprev X touch sreg_version.i X Xclean : X -Delete $(JUNK) X -Delete $(OBJ) X -Delete sregexpsr.lib sregexps.lib X Xinstall : X Copy $(LIBRARY) Libs: X Copy sregexpbase.h dinclude:pd/libraries X Copy sregexp_protos.h dinclude:pd/clib X Copy sregexps.lib dlib: X Copy sregexpsr.lib dlib: END_OF_FILE if test 1467 -ne `wc -c <'dmakefile'`; then echo shar: \"'dmakefile'\" unpacked with wrong size! fi # end of 'dmakefile' fi if test -f 'instillation.notes' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'instillation.notes'\" else echo shar: Extracting \"'instillation.notes'\" \(757 characters\) sed "s/^X//" >'instillation.notes' <<'END_OF_FILE' X X X If you have dmake, then just change to this directory and X type 'dmake install' and all of the files will be copied to X the appropriate place (if not you can edit the dmake file) X X If not, heres where they should go: X X sregexp.library should be copied to LIBS: X X sregexps.lib should go to DLIB: If you use a different X sregexpsr.lib compiler, you will have to use whatever X utility exists to turn the fd file into X your kind of library. X X sregexpbase.h should go in the 'libraries' directory, X where ever you keep your Amiga include X files. X X sregexp_protos.h Under 2.0 this goes in 'clib' I compiled X everything under 1.3, but I have a fake X 1.3 clib directory of my own making. X Basically put it where you want. X END_OF_FILE if test 757 -ne `wc -c <'instillation.notes'`; then echo shar: \"'instillation.notes'\" unpacked with wrong size! fi # end of 'instillation.notes' fi if test -f 'kludge.asm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'kludge.asm'\" else echo shar: Extracting \"'kludge.asm'\" \(1876 characters\) sed "s/^X//" >'kludge.asm' <<'END_OF_FILE' X X;------------------------------------------------------------------- X; Here are the links to the c code. Anything that dice can't make X; registered arguement versions of would have to stick the stuff onto the X; stack. Note that the fd file and dice must both have the same X; idea of what gets passed in what. I will perhaps automate that X; one day. For now just be carefull. X;------------------------------------------------------------------- X X section kludge,code X X xdef parsesregexp X xref @parsesregexp Xparsesregexp: X move.l a4,-(sp) X move.l a6,a4 X jsr @parsesregexp(pc) X move.l (sp)+,a4 X rts X X xdef freesregexp X xref @freesregexp Xfreesregexp: X move.l a4,-(sp) X move.l a6,a4 X jsr @freesregexp(pc) X move.l (sp)+,a4 X rts X X xdef matchsregexp X xref @matchsregexp Xmatchsregexp: X move.l a4,-(sp) X move.l a6,a4 X jsr @matchsregexp(pc) X move.l (sp)+,a4 X rts X X xdef matchnsregexp X xref @matchnsregexp Xmatchnsregexp: X move.l a4,-(sp) X move.l a6,a4 X jsr @matchnsregexp(pc) X move.l (sp)+,a4 X rts X X xdef iswild X xref @iswild Xiswild: X move.l a4,-(sp) X move.l a6,a4 X jsr @iswild(pc) X move.l (sp)+,a4 X rts X X xdef anchorpath X xref @anchorpath Xanchorpath: X move.l a4,-(sp) X move.l a6,a4 X jsr @anchorpath(pc) X move.l (sp)+,a4 X rts X X xdef nextfile X xref @nextfile Xnextfile: X move.l a4,-(sp) X move.l a6,a4 X jsr @nextfile(pc) X move.l (sp)+,a4 X rts X X xdef buildpath X xref @buildpath Xbuildpath: X move.l a4,-(sp) X move.l a6,a4 X jsr @buildpath(pc) X move.l (sp)+,a4 X rts X X xdef freespathinfo X xref @freespathinfo Xfreespathinfo: X move.l a4,-(sp) X move.l a6,a4 X jsr @freespathinfo(pc) X move.l (sp)+,a4 X rts X X end END_OF_FILE if test 1876 -ne `wc -c <'kludge.asm'`; then echo shar: \"'kludge.asm'\" unpacked with wrong size! fi # end of 'kludge.asm' fi if test -f 'revision.history' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'revision.history'\" else echo shar: Extracting \"'revision.history'\" \(468 characters\) sed "s/^X//" >'revision.history' <<'END_OF_FILE' X X version 9.x X First version ready for general release, everything seems X to work ok. X X versions 4.0 - 8.xx X Various steps on the long road to getting the path matching X routines to actually work. X X version 2.0 - 3.xx X Porting of the pattern matching routines from a link time X library to a run time library. X X version 1.xx X Figuring out how to make a @&*! Amiga run time library X go. WHY DOES IT GURU WHEN I EXPUNGE, AHHHHH! Well X it worked in the end. END_OF_FILE if test 468 -ne `wc -c <'revision.history'`; then echo shar: \"'revision.history'\" unpacked with wrong size! fi # end of 'revision.history' fi if test -f 'spath.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'spath.c'\" else echo shar: Extracting \"'spath.c'\" \(12546 characters\) sed "s/^X//" >'spath.c' <<'END_OF_FILE' X X/********************************************************************** X * This is the stuff for matching to a wildcarded path. see the docs * X * * X * * X * Copyright (c) 1991 by Jon Spencer. * X * * X * Revision history: * X * May 10, 1991 First version basically completed * X * * X **********************************************************************/ X X#include "sregexp.h" X Xextern struct DosLibrary *DOSBase; X X#ifdef __DEBUG__ Xvoid puts(char *); Xvoid printf(char *, ...); X#endif X X#define ROOT ((struct RootNode *)DOSBase->dl_Root) X#define INFO ((struct DosInfo *)ROOT->rn_Info<<2) X#define DEVC(a) ((struct DeviceList *)a<<2) X Xstruct SpathInfo * Xanchorpath(anc,wld) Xchar *anc,*wld; X/* This is routine sets everything up for matching wildcard paths. X It does the expansion of any wildcards in the volume node part X of the path, if any where specified, and gets ready to roll. */ X{ X struct SpathInfo *spi; X struct SpathNode *spn; X BPTR lock; X register char *q; X char *node,*p,c; X struct DeviceList *dvc; X struct SregExp *pat; X X X if (!(spi = getmem(sizeof(struct SpathInfo)))) { X report(MEM_ERROR); X return NULL; X } X NewList((struct List *)spi); X X for (q = wld; *q != ':' && *q != '/' && *q; q++) ; X X if (*q == ':') { X if (!(node = getmem(q - wld + 1))) { X report(MEM_ERROR); X FreeMem(spi,sizeof(struct SpathInfo)); X FreeMem(spi,sizeof(struct SpathInfo)); X return NULL; X } X for (q = wld, p = node; *q != ':'; ) X *p++ = *q++; X *p = 0; X X pat = parsesregexp(node); X FreeMem(node,strlen(node)+1); X if (!pat) { X FreeMem(spi,sizeof(struct SpathInfo)); X return NULL; X } X X /* Check if there is no path to parse */ X if (*(q+1)) { X if (!(spi->spi_SregList = parsepath(q+1))) { X freesregexp(pat); X FreeMem(spi,sizeof(struct SpathInfo)); X return NULL; X } X } else X spi->spi_SregList = NULL; X X X if (pat->sre_Type == SRP_NULL) { /* check for paths matching ":..." */ X X if (!(lock = Lock(anc,SHARED_LOCK))) { X freesregexp(pat); X freespathinfo(spi); X return NULL; X } X if (!(node = getmem(2))) { X report(MEM_ERROR); X UnLock(lock); X freesregexp(pat); X freespathinfo(spi); X return NULL; X } X node[0] = ':'; X node[1] = 0; X if (!(spn = makespathnode(lock,node,spi->spi_SregList))) { X UnLock(lock); X FreeMem(node,2); X freesregexp(pat); X freespathinfo(spi); X return NULL; X } X spn->spn_NodeName = node; X AddTail((struct List *)spi,(struct Node *)spn); X UnLock(lock); X } else { X for (dvc = DEVC(INFO->di_DevInfo); dvc; dvc = DEVC(dvc->dl_Next)) { X p = (char *)dvc->dl_Name<<2; X if (matchnsregexp(p+1,pat,FALSE,*p)) { X if (!(node = getmem(*p+2))) { X report(MEM_ERROR); X freesregexp(pat); X freespathinfo(spi); X return NULL; X } X for (c = *p++, q = node; c > 0; c--) X *q++ = *p++; X *q++ = ':'; X *q = 0; X if (dvc->dl_Type == DLT_DEVICE) { X lock = Lock(node,SHARED_LOCK); /* ignore non-filesystem devices */ X if (!lock) X continue; X UnLock(lock); X } X if (!(spn = makespathnode(NULL,node,spi->spi_SregList))) { X FreeMem(node,strlen(node)+1); X X freespathinfo(spi); X return NULL; X } X spn->spn_NodeName = node; X AddTail((struct List *)spi,(struct Node *)spn); X } X } X } X freesregexp(pat); X } else { X /* check if there is any path to parse */ X if (*wld) { X if (!(spi->spi_SregList = parsepath(wld))) { X FreeMem(spi,sizeof(struct SpathInfo)); X return NULL; X } X } else X spi->spi_SregList = NULL; X X if (!(spn = makespathnode(NULL,anc,spi->spi_SregList))) X freespathinfo(spi); X AddTail((struct List *)spi,(struct Node *)spn); X } X return spi; X} X X#undef ROOT X#undef INFO X#undef DEVC X Xstruct SregList * Xparsepath(wld) Xchar *wld; X/* This routine takes a wildcarded path and turns it into a singly X linked list of SregExp structures, one node for each path element. */ X{ X char *q,*p,*cp,c = 1,recurse; X struct SregExp *sre; X struct SregList *srl,*srr = NULL; X X if (!(cp = getmem(strlen(wld)+1))) { X report(MEM_ERROR); X return NULL; X } X strcpy(cp,wld); X X q = cp; X while (*q && c) { X if (strncmp(q,".../",4) == 0) { X recurse = SRF_RECURSE; X q += 4; X } else X recurse = 0; X p = q; X while (*q && *q != '/') q++; X c = *q; X *q = 0; X if (!(sre = parsesregexp(p))) X goto bad; X sre->sre_Flag |= recurse; X *q++ = c; X if (!srr) { X if (!(srl = srr = getmem(sizeof(struct SregList)))) { X report(MEM_ERROR); X goto bad; X } X } else { X if (!(srl = (srl->srl_next = getmem(sizeof(struct SregList))))) { X report(MEM_ERROR); X goto bad; X } X } X srl->srl_next = NULL; X srl->srl_sreg = sre; X } X if (c == '/') /* If path ends in a / then just take dirs */ X srl->srl_sreg->sre_Flag |= SRF_JUSTDIRS; X X FreeMem(cp,strlen(cp)+1); X return srr; X Xbad: X if (sre) X freesregexp(sre); X FreeMem(cp,strlen(cp)+1); X X while (srl) { X if (srl->srl_sreg) X freesregexp(srl->srl_sreg); X FreeMem(srl,sizeof(struct SregList)); X srl = srl->srl_next; X } X return NULL; X} X Xstruct SpathNode * Xmakespathnode(lock,file,sreg) XBPTR lock; Xchar *file; Xstruct SregList *sreg; X/* This routine makes a new node to be linked into the list of current X directory locks, basically */ X{ X struct SpathNode *spn; X BPTR cdir; X X X if (!(spn = getmem(sizeof(struct SpathNode)))) { X report(MEM_ERROR); X return NULL; X } X if (lock) X cdir = CurrentDir(lock); X if (!(spn->spn_Lock = Lock(file,SHARED_LOCK))) { X FreeMem(spn,sizeof(struct SpathNode)); X return NULL; X } X spn->spn_SregList = sreg; X if (!(Examine(spn->spn_Lock,&spn->spn_FIB))) { X UnLock(spn->spn_Lock); X FreeMem(spn,sizeof(struct SpathNode)); X return NULL; X } X spn->spn_Flags = 0; X spn->spn_NodeName = NULL; X if (lock) X CurrentDir(cdir); X X return spn; X} X X X X#define FILENAME (spn->spn_FIB.fib_FileName) X#define NEXTPATH (spn->spn_SregList->srl_next) X#define THISPATH (spn->spn_SregList) X#define LOCK (spn->spn_Lock) X#define FIB (spn->spn_FIB) X#define SREG (spn->spn_SregList->srl_sreg) X#define ISDIR (FIB.fib_DirEntryType > 0) X#define ISRECURSE (SREG->sre_Flag & SRF_RECURSE) X#define ISDONEONCE (spn->spn_Flags & SPF_DONEONCE) X#define ISJUSTDIRS (SREG->sre_Flag & SRF_JUSTDIRS) X#define WANTIT (ISDIR ? dirs >= 0 : !ISJUSTDIRS && dirs <= 0) X#define SIGBREAKF_ANY (SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_D | SIGBREAKF_CTRL_E | SIGBREAKF_CTRL_F) X Xint Xnextfile(spi,buf,len,dirs) Xstruct SpathInfo *spi; Xchar *buf; Xint len,dirs; X/* This routine is a mess. It jumps all over the place and is generally X hard to follow. The basic idea behind it is to implement recursion, X but without using the stack. Basically the linked list of SpathNode X structures, anchored in the SpathInfo structure works as our stack X for us. "Why not just use the stack?" you ask. Well, unfortunately, X we have to return in the middle of the scan, each time a new match X is found. This would mean unrolling all of the stack that defines X how far through the search we are to get back to the return address. X By using the linked list of SpathInfo structures, we can preserve X the state of the 'stack' betweem calls. */ X{ X struct SpathNode *spn; X X Xtry_again: X X if (SetSignal(0,0) & SIGBREAKF_ANY) X return SPE_SIGBREAK; X X spn = spi->spi_TailPred; X X /* check if we're done. */ X if (!spn->spn_Pred) { X report(ERROR_NO_MORE_ENTRIES); X return SPE_ALL_DONE; X } X X /* check if we're at the end of the path: used to match just nodes.*/ X if (!THISPATH) { X if (ISDONEONCE) X goto pop; X X spn->spn_Flags |= SPF_DONEONCE; X X if (dirs >= 0) { X return buildpath(spi,buf,len); X } else X goto pop; X } X X /* check if we set a delayed decend */ X if (spn->spn_Flags & SPF_DECEND) X goto decend; X X /* check if it matches the null string, ie parent dir */ X if (SREG->sre_Type == SRP_NULL) { X X /* Check if its done or there is no parent. */ X if (ISDONEONCE || !ParentDir(LOCK)) X goto pop; X X spn->spn_Flags |= SPF_DONEONCE; /* Mark it as done. */ X X /* mark it as parent match for buildpath */ X spn->spn_Flags |= SPF_NEXTPARENT; X X if (!(spn = makespathnode(LOCK,"/",NEXTPATH))) X return SPE_ERROR; X AddTail((struct List *)spi,(struct Node *)spn); X goto try_again; X } X X /* Check if we can do it quickly */ X if ((SREG->sre_Type == SRP_STRING || X SREG->sre_Type == SRP_ONECHAR) && !ISRECURSE) { X BPTR cdir,lock; X X /* Have we already done it? */ X if (ISDONEONCE) X goto pop; X X /* Mark it as done. */ X spn->spn_Flags |= SPF_DONEONCE; X X cdir = CurrentDir(LOCK); X if (SREG->sre_Type == SRP_STRING) X lock = Lock(SREG->sre_Data.string,SHARED_LOCK); X else { X char n[2]; X X n[0] = SREG->sre_Data.onechar; X n[1] = 0; X lock = Lock(n,SHARED_LOCK); X } X CurrentDir(cdir); X if (!lock) X goto pop; X if (!Examine(lock,&FIB)) { X UnLock(lock); X return SPE_ERROR; X } X UnLock(lock); X X if (!NEXTPATH) { X if (WANTIT) X return buildpath(spi,buf,len); X else X goto pop; X } X if (ISDIR) { X if (!(spn = makespathnode(LOCK,FILENAME,NEXTPATH))) { X return SPE_ERROR; X } X AddTail((struct List *)spi,(struct Node *)spn); X goto try_again; X } X goto pop; X } X X while (ExNext(LOCK,&FIB)) { X if (SetSignal(0,0) & SIGBREAKF_ANY) X return SPE_SIGBREAK; X X if (matchsregexp(FILENAME,SREG,FALSE)) { X if (ISDIR && ISRECURSE) X spn->spn_Flags |= SPF_DECEND; X if (!NEXTPATH) { X if (WANTIT) X return buildpath(spi,buf,len); X } else if (ISDIR) { X if (!(spn = makespathnode(LOCK,FILENAME,NEXTPATH))) { X return SPE_ERROR; X } X AddTail((struct List *)spi,(struct Node *)spn); X goto try_again; X } X } X if (ISDIR && ISRECURSE) { Xdecend: X spn->spn_Flags &= ~SPF_DECEND; X if (!(spn = makespathnode(LOCK,FILENAME,THISPATH))) { X return SPE_ERROR; X } X AddTail((struct List *)spi,(struct Node *)spn); X goto try_again; X } X } X X if (IoErr() != ERROR_NO_MORE_ENTRIES) X return SPE_ERROR; X Xpop: X RemTail((struct List*)spi); X freespathnode(spn); X goto try_again; X} X X#undef FILENAME X#undef NEXTPATH X#undef THISPATH X#undef LOCK X#undef FIB X#undef SREG X#undef ISDIR X#undef ISRECURSE X#undef ISDONEONCE X#undef ISJUSTDIRS X#undef WANTIT X X Xint Xbuildpath(spi,buf,len) Xstruct SpathInfo *spi; Xchar *buf; Xint len; X/* This routine turns the current 'stack' of SpathNode structures into X a file name the AmigaDOS will like. */ X{ X struct SpathNode *spn = spi->spi_Head; X int i = 0; X char *q; X X if (len < 1) X return SPE_BUFF_FULL; X X if (spn->spn_Succ && spn->spn_NodeName) { X while (spn->spn_Succ->spn_Succ && spn->spn_Succ->spn_NodeName) { X spn = spn->spn_Succ; X } X } X X if (q = spn->spn_NodeName) { X while (*q && i < len) X buf[i++] = *q++; X if (i >= len) X return SPE_BUFF_FULL; X } X while (spn->spn_Succ) { X if (spn->spn_Flags & SPF_NEXTPARENT) { X buf[i++] = '/'; X if (i >= len) X return SPE_BUFF_FULL; X } else { X q = spn->spn_FIB.fib_FileName; X while (*q && i < len) X buf[i++] = *q++; X if (i >= len) X return SPE_BUFF_FULL; X if (spn->spn_Succ->spn_Succ || X spn->spn_SregList->srl_sreg->sre_Flag & SRF_JUSTDIRS) { X buf[i++] = '/'; X if (i >= len) X return SPE_BUFF_FULL; X } X } X spn = spn->spn_Succ; X } X X buf[i] = 0; X return i; X} X Xvoid Xfreespathinfo(spi) Xstruct SpathInfo *spi; X/* This routine frees all of the resoureces tied up in a SpathInfo X structure */ X{ X struct SpathNode *spn; X struct SregList *srl,*next; X X while (spn = (struct SpathNode *)RemTail((struct List *)spi)) X freespathnode(spn); X X for (srl = spi->spi_SregList; srl; srl = next) { X freesregexp(srl->srl_sreg); X next = srl->srl_next; X FreeMem(srl,sizeof(struct SregList)); X } X X FreeMem(spi,sizeof(struct SpathInfo)); X} X Xvoid Xfreespathnode(spn) Xstruct SpathNode *spn; X/* This routine frees the memory and lock in a SpathNode structure. */ X{ X if (spn->spn_NodeName) { X FreeMem(spn->spn_NodeName,strlen(spn->spn_NodeName)+1); X } X UnLock(spn->spn_Lock); X FreeMem(spn,sizeof(struct SpathNode)); X} X X X#ifdef __DEBUG__ X X/* This is some debugging stuff, not compiled into the release version. */ X Xvoid Xputs(c) Xchar *c; X{ X Write(Output(),c,strlen(c)); X Write(Output(),"\n",1); X} X X#include <stdarg.h> X Xextern void vsprintf(char *, char *, va_list); X Xvoid printf(f, ...) Xchar *f; X{ X char buff[100]; X va_list va; X X va_start(va,f); X vsprintf(buff,f,va); X va_end(va); X Write(Output(),buff,strlen(buff)); X} X X#endif END_OF_FILE if test 12546 -ne `wc -c <'spath.c'`; then echo shar: \"'spath.c'\" unpacked with wrong size! fi # end of 'spath.c' fi if test -f 'sreg_version.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sreg_version.c'\" else echo shar: Extracting \"'sreg_version.c'\" \(68 characters\) sed "s/^X//" >'sreg_version.c' <<'END_OF_FILE' X X Xconst __far char idString[] = "sreglib 9.4 ("__DATE__")\x0d\x0a"; END_OF_FILE if test 68 -ne `wc -c <'sreg_version.c'`; then echo shar: \"'sreg_version.c'\" unpacked with wrong size! fi # end of 'sreg_version.c' fi if test -f 'sreg_version.i' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sreg_version.i'\" else echo shar: Extracting \"'sreg_version.i'\" \(44 characters\) sed "s/^X//" >'sreg_version.i' <<'END_OF_FILE' X XVERSION equ 9 XREVISION equ 4 X X X X X END_OF_FILE if test 44 -ne `wc -c <'sreg_version.i'`; then echo shar: \"'sreg_version.i'\" unpacked with wrong size! fi # end of 'sreg_version.i' fi if test -f 'sregexp.fd' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sregexp.fd'\" else echo shar: Extracting \"'sregexp.fd'\" \(279 characters\) sed "s/^X//" >'sregexp.fd' <<'END_OF_FILE' X##base _SregExpBase X##bias 30 X##public XParseSregExp(p)(a0) XFreeSregExp(p)(a0) XMatchSregExp(p,p1,n)(a0,a1,d0) XMatchNSregExp(p,p1,n)(a0,a1,d0,d1) XIsWild(p)(a0) XAnchorPath(anchor,path)(a0,a1) XNextFile(p1,p2,n,n1)(a0,a1,d0,d1) XBuildPath(p1,p2,n)(a0,a1,d0) XFreeSpathInfo(p)(a0) X##end END_OF_FILE if test 279 -ne `wc -c <'sregexp.fd'`; then echo shar: \"'sregexp.fd'\" unpacked with wrong size! fi # end of 'sregexp.fd' fi if test -f 'sregexp.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sregexp.h'\" else echo shar: Extracting \"'sregexp.h'\" \(1868 characters\) sed "s/^X//" >'sregexp.h' <<'END_OF_FILE' X X/* This is used for COMPILING sregexp.library, it should not be included X if you just USE the library. See sregexpbase.h */ X X#include <stddef.h> X#include <stdlib.h> X#include <string.h> X#include <ctype.h> X#include <clib/exec_protos.h> X#include <clib/dos_protos.h> X#include <libraries/dosextens.h> X#include "sregexpbase.h" X X#define TRUE 1 X#define FALSE 0 X X X#define MEM_ERROR ERROR_NO_FREE_STORE /* report no mem */ X#define ILLEGAL_ERR ERROR_INVALID_COMPONENT_NAME /* bad sregexp */ X X X/* some handy fingersaving macros. */ X#define realen(a) (((a)->sre_Flag&(SRF_REPEAT|SRF_NOT))?0:(a)->sre_MinLen) X#define isfixed(s) (((s)->sre_Flag&(SRF_REPEAT|SRF_NOT|SRF_FIXLEN))==SRF_FIXLEN) X#define matchset(s,c) ((s)->sre_Data.setchar[(c)/8] & 1 << (c)%8) X#define getmem(a) AllocMem(a,0) X Xstatic struct SregExp * parsesub(char **, char); Xstatic struct SregExp * makesum(struct SregList *, int); Xstatic struct SregExp * makeor(struct SregList *,int); Xstatic struct SregExp * parseone(char **, char); Xstatic char onechar(char **, char); Xstatic char * makeset(char **); Xstatic int matchsum(struct SregExp *[], int, char *, int, int); Xstatic void report(int); Xstatic struct SpathNode * makespathnode(BPTR, char *, struct SregList *); Xstatic void freespathnode(struct SpathNode *); Xstatic struct SregList * parsepath(char *); X Xextern struct SregExp * parsesregexp(char *); Xextern void freesregexp(struct SregExp *); Xextern int matchsregexp(char *, struct SregExp *, int); Xextern int matchnsregexp(char *, struct SregExp *, int, int); Xextern int iswild(char *); Xextern struct SpathInfo * anchorpath(char *, char *); Xextern int nextfile(struct SpathInfo *, char *, int, int); Xextern int buildpath(struct SpathInfo *, char *, int); Xextern void freespathinfo(struct SpathInfo *); X END_OF_FILE if test 1868 -ne `wc -c <'sregexp.h'`; then echo shar: \"'sregexp.h'\" unpacked with wrong size! fi # end of 'sregexp.h' fi if test -f 'sregexp.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sregexp.uu'\" else echo shar: Extracting \"'sregexp.uu'\" \(12272 characters\) sed "s/^X//" >'sregexp.uu' <<'END_OF_FILE' Xbegin 600 sregexp.library XM```#\P`````````!``````````````AC```#Z0``"&-P_TYU2OP````$```!V XM6H`)"0````%*```0P````!X````N````+@```&8```"2````R@```-@```#L' XM```!.@```5P```%H```!=````8````&,```!F````:0```&P```!O/_____@, XM```("0#````*```!2N````X&`-```!0`"=```!8`!,```!@``!#``````"\,4 XM*$`I3@`B*4@`*D/Z`)YP`$ZN_=@I0``F9A9(YP$&+CP``X`'+'@`!$ZN_Y1,P XMWV"`(`PH7TYU4FX`(`BN``,`#B`.3G5P`%-N`"!F"@@N``,`#F<"81).=4INL XM`"!G"@CN``,`#G``3G5(YR`$*DXL;0`B)"T`*B)-(%$B:0`$(H@A20`$(FT`B XM)DZN_F)P`")-,"T`$)/`T&T`$DZN_RX@`DS?(`1.=7``3G5D;W,N;&EB<F%RP XM>0!S<F5G97AP+FQI8G)A<GD`3G$O#"A.3KH`<BA?3G4O#"A.3KH(MBA?3G4O^ XM#"A.3KH)'BA?3G4O#"A.3KH)."A?3G4O#"A.3KH.Y"A?3G4O#"A.3KH//BA?! XM3G4O#"A.3KH5*"A?3G4O#"A.3KH8CBA?3G4O#"A.3KH98"A?3G4C?B@I6UT_1 XM)7PG*@!.5?_\*TC__'``0>W__$ZZ``HB0"`)3EU.=4CG.#(D`$Y5_^PK2/_\; XM<``K0/_TE<IV`'@`(&W__"!0M!!F``$F0?H.IBM(_^QP`4'M_^Q.N@/6(D`@> XM"6```=Y@``$(<`$@;?_\3KH#P"9`(`MF!&```6)*K?_T9RH@;?_X+$AR`'`(0 XM3KH>U"U```0K;@`$__A*K?_X9BYP9TZZ#C)@``$T8")R`'`(3KH>L"M`__0K` XM;?_T__A*K?_X9@IP9TZZ#@Y@``$0+&W_^"R++&W_^'``+4``!%*#+&W__"Q6$ XM#!8`?&8``((@`R!M__1.N@%2)D`@"V8$8```W"`*9RH@;?_P+$AR`'`(3KH>V XM4"U```0K;@`$__!*K?_P9BIP9TZZ#:Y@``"P8!YR`'`(3KH>+"1`*TK_\$JMF XM__!F"G!G3KH-CF```)`L;?_P+(LL;?_P<``M0``$4H0L;?_\4I9P`"M`__1V' XM`"QM__PL5K069@#^\"`#(&W_]$ZZ`,8F0"`+9@)@4"`*9T@@;?_P+$AR`'`(! XM3KH=QBU```0K;@`$__!*K?_P9@AP9TZZ#21@)BQM__`LBRQM__!P`"U```12, XMA"`$($I.N@%.)D`@"V8"8`0@"V!D*VW_]/_X8"0@;?_X*V@`!/_T(FW_^"!1` XM3KH&9'`((&W_^$ZZ'7(K;?_T__A*K?_X9M8K2O_X8"0@;?_X*V@`!/_T(FW_] XM^"!13KH&-'`((&W_^$ZZ'4(K;?_T__A*K?_X9M9P`$Y=3-],'$YU2.<^,B1(V XM)`!X`'H$2H)F$B`\````TDZZ#'9P`&```+!@%G`!L()F$"Q2<`@@2DZZ'/H@# XM#F```)A"IR("Y8$@`5"`(A].NAS4+$`@#F8,<&=.N@P\<`!@``!V'+P`!QU\4 XM`````2U"``1V`&!4(%(2*``!2(%(P7P#PH9G!'``8`H@4C(H``)(P2`!V(`@9 XM4A(H``%(@4C!?`?"AGP$O(%F!'`$8`)P`,H`(`/E@"V2"`@F:@`$<`@@2DZZV XM''`D2U*#M(-NJ#U$``*++@`!(`Y,WTQ\3G5(YSXR)$@D`'H$0J<B`N6!(`%0/ XM@"(?3KH<+BQ`(`YF#'!G3KH+EG``8```Y!R\``8=?`````$M0@`$=@!@``#`4 XM2H-F(B!2$"@``4B`2,!R`\"!9P9X`&```'(@4C`H``)(P"@`8&0@4A(H``%(R XM@4C!?`/"AF<$<`!@"B!2,B@``DC!(`&PA&=">@`@4A(H``%(@4C!?`/"AF<$6 XM<`!@"B!2,B@``DC!(`&PA&P>(%(0*``!2(!(P'(#P(%G!'@`8`H@4C`H``)(B XMP"@`(%(2*``!2(%(P7P'PH9\!+R!9@1P!&`"<`#*`"`#Y8`MD@@()FH`!'`(, XM($I.NAM>)$M2@[2#;@#_/CU$``*++@`!(`Y,WTQ\3G5(YS`R)$@D`$Y5__P@1 XM4A`0D#P`*F<``3YJ))`\`-9G``&4D#P`(V<\50!G``%85P!G``"04P!G``%\F XM8``!B)`\`!5G``#@D#P`'&<``(A5`&<``6*0/``?9P`!6E4`9T)@``%B4I)P) XM`"!*3KK_E"9`(`MF!G``8``"$@@K`````6<6(#P```#23KH*'"!+3KH#FG``S XM8``!]`CK``$``6```>A2DG``($I.NO]6)D`@"V8&<`!@``'4".L````!8``!E XMR%*2<"D@2DZZ^RHF0%*28``!ME*2<@!P"$ZZ&E8F0"(+9@QP9TZZ";YP`&``^ XM`9P6O``!%WP`!``!-WP``0`"($I.N@'8)T``!$JK``1F#G`$($M.NAHL<`!@> XM``%N4I)@``%F4I)R`'`(3KH:!B9`(@MF#'!G3KH);G``8``!3!:\``(7?``$S XM``$W?``!``)@``$V4I)R`'`(3KH9UB9`(@MF#'!G3KH)/G``8``!'!:\``(76 XM?``&``$W?``!``)@``$&4I)R`'`(3KH9IB9`(@MF#'!G3KH)#G``8```[!:\^ XM``47?``$``$W?`````)@``#6(#P```#23KH(ZG``8```R'(`<`A.NAEH)D`B# XM"V8,<&=.N@C0<`!@``"N%WP`!``!2@)F&G``($I.N@"D%T``!!:\``,W?``!` XM``)@``"(*U+__'8`8`)2@W``0>W__$ZZ`'X2`$H!9NXW0P`"<@&R@V82<``@+ XM2DZZ`&870``$%KP``V!0%KP`!'(`<`'0@TZZ&.XG0``$*VL`!/_\2JW__&82< XM<&=.N@A,<`0@2TZZ&.!P`&`B(&W__%*M__PL2'``($I.N@`:'(!*%F;H+&W_8 XM_!R\```@"TY=3-],#$YU2.<@("1()``@4@P0`"=F!%*28"8@4A`02(!(P$'Z5 XM^1Y.NA1F(D`@"68,2@)G#")2#!$`+68$<`!@"B!24I(0$$B`2,!,WP0$3G5(; XMYS\P)$A.5?_\&WP``/__=``@4@P0`'YF"%*2&WP``?__<@!P($ZZ&"XF0"(+` XM9@QP9TZZ!Y9P`&```0QV`&`,$`-(@!>\`````%(#MCP`(&WN8```DG0!(%(," XM$``M9EI2DG`!($I.NO].&`!*!&9$(#P```#23KH'4G`@($M.NA?F<`!@``#`` XM8"H0`TB`2,!R"$ZZ$IXJ`!(#2(%(P2`!<@A.NA).(@!\`>.F(@:#,U@`4@.X> XM`VS28"P2`TB!2,$@`7((3KH2;"(`*@$<`TB&2,8@!G((3KH2&BP`?@'MIRP'C XMC3-8`$AX``$@2B`?3KK^QA8`2@-F`/]>2@)G""!2#!``76<:2'@`TB`?3KH&Z XMO$AX`"`@2R`?3KH73'``8"9*+?__9QYV`&`4'`-(AAH#2(4:,U``1@47A6``& XM4@.V/``@;>8@"TY=3-\,_$YU2.<P("1(=``,$@`'9P8,$@`&9B(@*@`$Y8`DZ XM`'8`8`X@`^6`('(("$ZZ_]92@[:J``1M[&`N#!(`!&88(&H`!$ZZ$E8F`%*#D XM(`,@:@`$3KH6R&`0#!(``68*<"`@:@`$3KH6MG`(T((@2DZZ%JQ,WP0,3G5(, XMYS`P)$@F220`($I.NA(6(@`@`B)+($I.N@`,)@`@`TS?#`Q.=4CG/C(D2"9)8 XM)``F`0@K``$``6<``.Y*@V<&#!,``F8&>`%@``+>,"L``DC`L(-N*A`K``%() XM@$C`"````F<B2FL``F<6,"L``DC`(@/!04ZZ$+HB`"`!2H!G!G@`8``"I'P!B XMS"L``0(K`/P``0@K``(``6<P+$I@(C(K``)(P2`"(DL@3DZZ_WHH`$J$9@1@- XM``)R,BL``DC!W<$B#I**MH%NUF!2*@-@."(%(`(B2R!*3KK_3B@`2H1G)`CKA XM``$``2(#DH4@`B)+($K1Q4ZZ_S(H`$J$9P)@'@BK``$``5.%2FL``F<*,"L`S XM`DC`(@!@`G(!LH5OLG`"@`:!*P`!8``"`CPK``)(QKR#;A@<*P`!2(9(Q@@&0 XM``)G$#PK``)(QKR#9P9X`&```=H<$U,&9P``?E,&9P`!7%,&9S93!F<``5Y3! XM!F<``8Q3!F<``9!3!F<$8``!KB\"+P,O"B\K``1(:P`(3KH!N$_O`!0H`&``N XM`9)\`;R#9BI*@F<*'!*\*P`$9R1@'!P22(9!^A)3T,8<*P`$2(9#^A)'TL8<1 XM$+P19P9X`&```5QX`6```59\`;R#9C0<$DB&2,8@!G((3KH/BBP`(&L`!-'&B XM'!!(ADC&$!)(@$C`<@A.N@\P<@'AH2`!P(9F``"F2H)G!&```)@0$DB`0?H0' XMY=#`<``0$`@```=G0A`22(!!^A+9T,!P`!`0<@A.N@]@(&L`!-'`$!!(@$C`N XM+``0$DB`0?H2M]#`<``0$'((3KH/"G(!X:$@`<"&9DA@0!`22(!!^A&3T,!P( XM`!`0<@A.N@\>(&L`!-'`$!!(@$C`+``0$DB`0?H1<=#`<``0$'((3KH.R'(!= XMX:$@`<"&9@9X`&```'AX`6```')X`'`!L(-7Q$0$8&1*@F<8(`,B:P`$($I.J XMN@]B(@!X`$J!5\1$!&!((`,B:P`$($I.N@^R(@!X`$J!5\1$!&`P>`!*@U?$Z XM1`1@)GH`8!PB`R`"+`7EAB)S:`@@2DZZ_1`H`$J$9P)@"%*%NJL`!&W>""L`P XM```!9PQP`$J$5\!$`&`$8`(@!$S?3'Q.=4CG/S(D;P`H)F\`,"0O`#0F+P`XA XM3E4``&`X(%(R*``"2,$@`R)2($M.NORX*@!*A68&<`!@``)<(E(R*0`"2,'74 XMP2)2,BD``DC!E(%8BE.M`#!*K0`P9P``>B)2$BD``4B!2,%P!\*`<`2P@6>L] XM8&(@+0`P4X#E@")R"``R*0`"2,$@`RXM`#!3A^6'(G)X`"XM`#!3A^6'+')X@ XM`#XN``)(QT2'0?,H`-''3KK\-BH`2H5F!G``8``!VB(M`#!3@>6!(G(8`#(I& XM``)(P92!4ZT`,$JM`#!G("(M`#!3@>6!(G(8`!(I``%(@4C!<`?"@'`$L(%GV XM`/]Z2JT`,&8&<`%@``&0?`!X`6```10B!.6!(G(8`!(I``%(@4C!<`?"@'`$+ XML(%F``#*8```IB`$Y8`B<@@`,BD``DC!(`,N!.6'(G)X`"!+T<9.NON8*@!*0 XMA6<``'PO`R\&+PLO!"\*3KK^H$_O`!0J`$J%9@9P`&```2(O`R`"D(8B!.6![ XM(G(8`#(I``)(P42!TH`O`2($Y8$B<A@`,BD``D'S:`#0P4A0("T`,)"$4X`O& XM`'`!T(3E@$AR"`!.NOY*3^\`%"H`2H5F!G``8```S'`!8```QE*&(`*0AB($< XMY8$@<A@`,B@``DC!LH!O`/]&<`!@``"F8"PB!.6!('(8`!(H``%(@4C!?@/"C XMAV<$<`!@$"($Y8$@<A@`,B@``DC!(`'<@%*$("T`,%.`L(1N`/[D<`&PK0`P2 XM9A(B`B`#(E(@2TZZ^J8N`"`'8$XL`F`\(@8@`R)2($M.NOJ0+@!*AV<H+P,@O XM`I"&+P!(<V@`("T`,%.`+P!(:@`$3KK]C$_O`!1*@&<$<`%@$%.&(E(P*0`"` XM2,"PAF^X<`!.74S?3/Q.=4Y5__PK2/_\<`!![?_\3KKX!A(`2@%F\"!M__QR. XM`$H05L%$`2`!3EU.=4CG("`D`)'(3KH0PB1`(`IG!"5"`)1,WP0$3G4E`$YQ9 XM<W)E9VQI8B`Y+C0@*$UA>2`Q,"`Q.3DQ*0T*`$CG.#).5?_D*TC__"M)__ARQ XM`'`03KH0.BM`__1*K?_T9@QP9TZZ_YYP`&```Z0@;?_T3KH*I"MM__C_[&`$3 XM4JW_["!M_^P,$``Z9Q(@;?_L#!``+V<((&W_[$H09N`@;?_L#!``.F8``OIR= XM`"@M_^R8K?_X<`'0A$ZZ#]8K0/_H2JW_Z&8@<&=.NO\Z<!`@;?_T3KH/S'`0? XM(&W_]$ZZ#\)P`&```RPK;?_X_^PK;?_H_^1@$B!M_^12K?_D(FW_[%*M_^P0L XMD2!M_^P,$``Z9N0@;?_D$+P``"!M_^A.NO`:)D`@;?_H3KH*^%*`(&W_Z$ZZ= XM#VX@"V80<!`@;?_T3KH/8'``8``"RB!M_^Q**``!9S0@;?_T+$AP`2!`T>W_Y XM[$ZZ`K8M0``,2JX`#&8B($M.NO@6<!`@;?_T3KH/)'``8``"CF`*(&W_]'``G XM(4``#`P3``5F``#*</X@;?_\3KH.:"0`2H)F%"!+3KKWW"!M__1.N@C2<`!@7 XM``)6<@!P`DZZ#LXK0/_H2JW_Z&8@<&=.NOXR(`).N@Y(($M.NO>J(&W_]$ZZ! XM"*!P`&```B0@;?_H$+P`.B!M_^@1?`````$@;?_T(F@`#"!M_^@@`DZZ`X0K` XM0/_P2JW_\&8D(`).N@X`<`(@;?_H3KH.=B!+3KKW6"!M__1.N@A.<`!@``'2, XM(&W_\"%M_^@!%")M__`@;?_T3KH.7"`"3KH-QF```3PB;``F(FD`(B`I`!CEW XM@")`("D`!.6`)$!@``$:("H`*.6`*T#_Y")M_^02$4B!2,%P`")+>`$@1-'MW XM_^1.NO>$*`!*A&<``.AR`")M_^08$4B$2,1P`M"$3KH-UBM`_^A*K?_H9AIPA XM9TZZ_3H@2TZZ]K@@;?_T3KH'KG``8``!,B!M_^12K?_D%A`K;?_H_^Q@%"!MJ XM_^Q2K?_L(FW_Y%*M_^00D5,#2@-NZ"!M_^Q2K?_L$+P`.B!M_^P0O```2JH`C XM!&88</X@;?_H3KH,W"0`2H)F`F!8(`).N@SF(&W_]")H``P@;?_H<`!.N@)(, XM*T#_\$JM__!F("!M_^A.N@C"4H`@;?_H3KH-."!M__1.N@<6<`!@``":(&W_Z XM\"%M_^@!%")M__`@;?_T3KH-)"`2Y8`D0"`*9@#^Y"!+3KKUZF!J(&W_^$H08 XM9R@@;?_T+$@@;?_X3KH`8BU```Q*K@`,9AIP$"!M__1.N@S6<`!@0&`*(&W_> XM]'``(4``#"!M__0B:``,(&W__'``3KH!J"M`__!*K?_P9@@@;?_T3KH&B")MC XM__`@;?_T3KH,IB`M__1.74S?3!Q.=4CG,#!.5?_L*TC__'0!E\M"IR!M__Q.+ XMN@?P4H`B'TZZ#%@K0/_P2JW_\&8,<&=.NON\<`!@``$^(FW__"!M__!.N@@&C XM*VW_\/_X8```N'`$0_H&J"!M__A.N@>^(@!*@68(=H!8K?_X8`)V`"MM__C_Y XM]&`$4JW_^")M__A*$6<*(FW_^`P1`"]FZB)M__@4$2)M__@2O```(&W_]$ZZ) XM[((K0/_L2JW_[&8$8```BB!M_^R'*``!(&W_^%*M__@0@B(+9AIR`'`(3KH+8 XMKB9`)$LB"F8F<&=.NOL48%I@''(`<`A.N@N4)4``!"1J``0B"F8(<&=.NOKV4 XM8#QP`"5```0DK?_L(&W_^$H09P9*`F8`_SZT/``O9@@@4@CH``8``2!M__!.K XMN@;B4H`@;?_P3KH+6"`+8#Y*K?_L9P@@;?_L3KKT+B!M__!.N@:^4H`@;?_PM XM3KH+-&`62I)G!B!23KKT$'`(($I.N@L@)&H`!"`*9N9P`$Y=3-\,#$YU2.<PA XM,B0`)$@F27(`(#P```$:3KH*Z"Q`(@YF#'!G3KKZ4'``8```=DJ"9P@@`DZZV XM"IPF`'#^($I.N@HZ+4`!#$JN`0QF$"`\```!&B!.3KH*O'``8$8M2P$00>X`F XM""`N`0Q.N@HX(@!*@688("X!#$ZZ"AH@/````1H@3DZZ"HYP`&`8/7P```$8> XM<``M0`$42H)G!B`#3KH*-"`.3-],#$YU2.<\,B1()DDD`"8!3E7__'(`<`!.9 XMN@J4*`#(O```\`!G!G#\8``#1"QJ``A*K@`$9A`@/````.A.NOF4</]@``,J9 XM2JX!$&8P""X``0$99P1@``,(".X``0$92H-M``+\(`(B2R!*3KH#"B(`(`%@` XM``+Z8`1@``+D""X```$99P1@``*&(FX!$")1#!$`!698,BX!&$C!"`$``68`O XM`KX@+@$,3KH)IB(`2H%F!&```JP([@`!`1D([@`"`1D@;@$0(F@`!$'Z!!0@Z XM+@$,3KK^D"Q`(`YF!G#^8``"D").($I.N@F88`#_*B)N`1`B40P1``1G#B)N] XM`1`B40P1``-F``(T(FX!$")1$"D``4B`2,`(```'9@`"'@@N``$!&6<$8``"1 XM.`CN``$!&2`N`0Q.N@CZ*``B;@$0(E$,$0`$9A1P_B)N`1`B42!I``1.N@B$H XM*@!@'B!N`1`@4!MH``3__AM\``#__W#^0>W__DZZ"&0J`"`$3KH(M$J%9@1@( XM``'<0>X`""`%3KH(<B(`2H%F#"`%3KH(5G#^8``!T"`%3KH(2B!N`1!*J``$8 XM9D)*K@`,;PA*@VT``:1@'"!N`1`@4!`H``%(@$C`"```!F8``8Q*@VX``88@Y XM`B)+($I.N@&4(@`@`6```81@!&```6Y*K@`,;P`!9B!N`1`B:``$0>X`$"`NE XM`0Q.NOU6+$`@#F8&</Y@``%6(DX@2DZZ"%Y@`/WP8``!-F```0QR`'``3KH(> XM>BH`RKP``/``9P9P_&```2IP`"!N`1`B4$'N`!!.NO%V*@!*A6<``)9*K@`,G XM;QHB;@$0(E$:*0`!2(5(Q0@%``=G!@CN```!&2)N`1!*J0`$9CA*K@`,;P9*% XM@VU@8!@B;@$0(E$:*0`!2(5(Q0@%``9F2DJ#;D8@`B)+($I.N@#"*@`@!6``P XM`+)@,DJN``QO+"!N`1`B:``$0>X`$"`N`0Q.NOR*+$`@#F8&</Y@``"*(DX@F XM2DZZ!Y)@`/TD2JX`#&]`(FX!$")1$"D``4B`2,`(```'9RP(K@```1DB;@$00 XM0>X`$"`N`0Q.NOQ"+$`@#F8$</Y@0B).($I.N@=,8`#\WD'N``@@+@$,3KH&# XMU"(`2H%F`/[D3KH&\"(`LKP```#H9P1P_F`0($I.N@<L($Y.N@%"8`#\J$Y=5 XM3-],/$YU2.<@,B10<@!T`;2`;P9P_6```,9*DF<82JH!%&<28`(D4BQ22I9G( XM""Q22JX!%&;P)FH!%"0+9P``E&`,)`%2@2Q+4HL3EB@`2A-G!+"!;NRP@6X`S XM`'AP_6```'Y@``!N""H``@$99Q0D`5*!$[P`+R@`L(%N5'#]8%Y@3D?J`!!@E XM#"0!4H$L2U*+$Y8H`$H39P2P@6[LL(%N!'#]8#HL4DJ69A0L:@$0+%84+@`!J XM2()(P@@"``9G$B0!4H$3O``O*`"P@6X$</U@#B122I)FD!.\```8`"`!3-],` XM!$YU2.<`,DY5__PK2/_\8`8@2DZZ`$0@;?_\3KH&("1`(`IF["!M__PF:``,( XM8!0@4TZZ[M(L:P`$<`@@2TZZ!=XF3B`+9NAP$"!M__Q.N@7.3EU,WTP`3G4O\ XM"B1(2JH!%&<2(&H!%$ZZ`312@"!J`11.N@6J("H!#$ZZ!2(@/````1H@2DZZK XM!98D7TYU+P`N+BXO``!#Z``$((EP`"%```0A2``(3G5.<4J!:PQ*@&L880``9 XM8B`!3G5$@4J`:Q9A``!41($@`4YU1(!A``!(1($@`4YU1(!A```\(`%.=4YQ. XM80``,B`!3G5*@6L(2H!K$F```")$@4J`:Q)A```81(!.=42`80``#D2`3G5$( XM@&````1.<4J!9QY(04I!9D(O`DA!)`"$P6D4(@)"04A!<``P`B0?3G4B`'#_X XM3G4O`R0`0D)(0H3!-@)(0T)#-`"$P38"(`-"0DA"(@(F'R0?3G5(YS@`)`!"2 XM0DA"A,$V`G0`-`/&P4A!.`+(P4A#UH20@VL*(@`@`DS?`!Q.=5."T(%K^B(`O XM(`),WP`<3G4B2&`"4HA*$&;Z(`B0B4YU2H!F&'``8"1@$DH!9P93@$J`9@1PM XM`&`44HA2B1(0LA%GZ+(19`1P_V`"<`%.=4YQ+PHD2&`$4HE2B!"12A!F]B`*+ XM)%].=4YQ8`P2`+(09@0@"&`04HA*$&;P2H!F!"`(8`)P`$YU3G%(YR`P2H!FP XM&'``8%!@$DH!9P93@$J`9@1P`&!`4HA2B1(0=``4`47Z`D74PG0`%!%'^@([, XMUL(4$K039])T`!0!1_H"*];"=``4$47Z`B'4PA03M!)D!'#_8`)P`4S?#`1.^ XM=4YQ``0$!`0$!`0$!$1$1$1$!`0$!`0$!`0$!`0$!`0$!`0$0!`0$!`0$!`0T XM$!`0$!`0$!D9&1D9&1D9&1D0$!`0$!`0DY.3DY.3DY.3DY.3DY.3DY.3DY.3I XMDY.3DY,0$!`0$!`S,S,S,S,S,S,S,S,S,S,S,S,S,S,S,S,S,Q`0$!`$````Q XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM``````````````````````````````````````````````````````$"`P0%/ XM!@<("0H+#`T.#Q`1$A,4%187&!D:&QP='A\@(2(C)"4F)R@I*BLL+2XO,#$RL XM,S0U-C<X.3H[/#T^/T!!0D-$149'2$E*2TQ-3D]045)35%565UA96EM<75Y?5 XM8$%"0T1%1D=(24I+3$U.3U!14E-455976%E:>WQ]?G^`@8*#A(6&AXB)BHN,^ XMC8Z/D)&2DY25EI>8F9J;G)V>GZ"AHJ.DI::GJ*FJJZRMKJ^PL;*SM+6VM[BYG XMNKN\O;Z_P,'"P\3%QL?(R<K+S,[.S]#1TM/4U=;7V-G:V]S=WM_@X>+CY.7F1 XMY^CIZNOL[>[O\/'R\_3U]O?X^?K[_/W^_P```````0(#!`4&!P@)"@L,#0X/S XM$!$2$Q05%A<8&1H;'!T>'R`A(B,D)28G*"DJ*RPM+B\P,3(S-#4V-S@Y.CL\N XM/3X_0&%B8V1E9F=H:6IK;&UN;W!Q<G-T=79W>'EZ6UQ=7E]@86)C9&5F9VAI7 XM:FML;6YO<'%R<W1U=G=X>7I[?'U^?X"!@H.$A8:'B(F*BXR-CH^0D9*3E)66` XMEYB9FIN<G9Z?H*&BHZ2EIJ>HJ:JKK*VNK["QLK.TM;:WN+FZN[R]OK_`P<+#I XMQ,7&Q\C)RLO,SL[/T-'2T]35UM?8V=K;W-W>W^#AXN/DY>;GZ.GJZ^SM[N_P3 XM\?+S]/7V]_CY^OO\_?[_````2.<@`B(()``L;``F3J[_K$S?0`1.=4YQ+PXB< XM`"QL`"9.KO^F+%].=4CG(`(B`"0(+&P`)DZN_YI,WT`$3G5.<4CG(`(B`"0(O XM+&P`)DZN_Y1,WT`$3G5.<2\.(@`L;``F3J[_@BQ?3G4O#BQL`"9.KO]\+%].Q XM=4YQ+PXB`"QL`"9.KO\N+%].=2\.+&P`(DZN_SHL7TYU3G$O#B)(+&P`(DZN> XM_RXL7TYU+PXL;``B3J[_"BQ?3G5.<2\.+&P`(DZN_O@L7TYU3G$O#B)(+&P`Y XM(DZN_MHL7TYU+PXL;``B3J[^SBQ?3G5.<0```^P````7``````````8````*F XM````$@```!H````B````)@```"H````N````,@```#8````Z````<````!8`T XM``"*````/@```$(```!&````2@```$X```!2````5@```%H```!>````````( X"`_**_ X`` Xend Xsize 8732 END_OF_FILE if test 12272 -ne `wc -c <'sregexp.uu'`; then echo shar: \"'sregexp.uu'\" unpacked with wrong size! fi # end of 'sregexp.uu' fi if test -f 'sregexp_protos.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sregexp_protos.h'\" else echo shar: Extracting \"'sregexp_protos.h'\" \(607 characters\) sed "s/^X//" >'sregexp_protos.h' <<'END_OF_FILE' X X#ifndef LIBRARIES_SREGEXPBASE_H X#include <libraries/sregexpbase.h> X#endif X Xextern struct SregExpBase *SregExpBase; X Xextern struct SregExp * ParseSregExp(char *); Xextern void FreeSregExp(struct SregExp *); Xextern int MatchSregExp(char *, struct SregExp *, int); Xextern int MatchNSregExp(char *, struct SregExp *, int, int); Xextern int IsWild(char *); Xextern struct SpathInfo * AnchorPath(char *, char *); Xextern int NextFile(struct SpathInfo *, char *, int, int); Xextern int BuildPath(struct Spathinf *, char *, int); Xextern void FreeSpathInfo(struct SpathInfo *); X END_OF_FILE if test 607 -ne `wc -c <'sregexp_protos.h'`; then echo shar: \"'sregexp_protos.h'\" unpacked with wrong size! fi # end of 'sregexp_protos.h' fi if test -f 'sregexpbase.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sregexpbase.h'\" else echo shar: Extracting \"'sregexpbase.h'\" \(3432 characters\) sed "s/^X//" >'sregexpbase.h' <<'END_OF_FILE' X X/* X * X * sregexpbase.h -- C include file for sregexp.library X * X * Copyright (C) 1991, Jon Spencer. X * X * Created: April 20,1991 X * X */ X X#ifndef LIBRARIES_SREGEXPBASE_H X#define LIBRARIES_SREGEXPBASE_H X X#ifndef EXEC_TYPE_H X#include <exec/types.h> X#endif X X#ifndef EXEC_LISTS_H X#include <exec/lists.h> X#endif X X#ifndef EXEC_LIBRARIES_H X#include <exec/libraries.h> X#endif X X#ifndef LIBRARIES_DOS_H X#include <libraries/dos.h> X#endif X X X/* X * X * Library base structure, all of these fields are private, and X * should not be accessed. X * X */ X Xstruct SregExpBase { X struct Library LibNode; X struct Library *SysBase; X struct Library *DOSBase; X BPTR Segment; X}; X X#define SREGEXPNAME "sregexp.library" X X X/* X * X * Here are the defines for the structures used and returned by X * the various sreg functions. They should probably not be X * accessed for there contents, unless you have really good X * reason... X * X */ X Xstruct SregExp { X char sre_Type,sre_Flag; X SHORT sre_MinLen; X union { X char onechar; X char *setchar; X char *string; X LONG number; X } sre_Data; X struct SregExp * sre_List[]; X}; X X X/* This is an internal structure for a singly linked list of sregexp's */ Xstruct SregList { X struct SregExp *srl_sreg; X struct SregList *srl_next; X}; X X X/* various types of wildcard pattern elements. X Goes in struct SregExp.type field */ X X#define SRP_SETCHAR 1 X#define SRP_ANYCHAR 2 X#define SRP_ONECHAR 3 X#define SRP_STRING 4 X#define SRP_NULL 5 X#define SRP_OR 6 X#define SRP_SUM 7 X X X X/* various flags to mark special properties of patterns. X Goes in struct SregExp.flag */ X X#define SRF_NOT (1<<0) X#define SRF_REPEAT (1<<1) X#define SRF_FIXLEN (1<<2) X#define SRF_JUSTDIRS (1<<6) /* special flag used in path matching */ X#define SRF_RECURSE (1<<7) /* dito. */ X X/* defines for the wildcard characters */ X X#define CHR_REPEAT '#' X#define CHR_NOT '~' X#define CHR_OPENBRACE '(' X#define CHR_CLOSEBRACE ')' X#define CHR_OPENSET '[' X#define CHR_CLOSESET ']' X#define CHR_ANYCHAR '?' X#define CHR_NULL '%' X#define CHR_OR '|' X#define CHR_ESCAPE '\'' X#define CHR_RANGE '-' X#define CHR_STAR '*' X X X X X/* These are the structures used for the path matching routines. */ X Xstruct SpathInfo { X struct SpathNode * spi_Head; X struct SpathNode * spi_Tail; X struct SpathNode * spi_TailPred; X struct SregList * spi_SregList; X}; X X X/* Note: because of the fileinfoblock, this whole structure MUST X be longword aligned. */ X Xstruct SpathNode { X struct SpathNode * spn_Succ; X struct SpathNode * spn_Pred; X struct FileInfoBlock spn_FIB; X BPTR spn_Lock; X struct SregList * spn_SregList; X char * spn_NodeName; X short int spn_Flags; X}; X X/* flags used in spn_Flags, which is really library private */ X#define SPF_DECEND (1<<0) /* Should recursively search, when we get the chance. */ X#define SPF_DONEONCE (1<<1) /* Already done it, don't do again */ X#define SPF_NEXTPARENT (1<<2) /* Next one is lock on parentdir */ X X X/* These are the possible error returns sent by NextFile and BuildPath */ X X#define SPE_ALL_DONE -1 /* no more matching files */ X#define SPE_ERROR -2 /* some error occured, see IoErr() */ X#define SPE_BUFF_FULL -3 /* you didn't give me enough room! */ X#define SPE_SIGBREAK -4 /* A control signal came through. */ X X X/* Some defines for what kind of events we match to. */ X X#define SP_DIRS_ONLY 1 X#define SP_BOTH 0 X#define SP_FILES_ONLY -1 X X#endif END_OF_FILE if test 3432 -ne `wc -c <'sregexpbase.h'`; then echo shar: \"'sregexpbase.h'\" unpacked with wrong size! fi # end of 'sregexpbase.h' fi if test -f 'sregexpbase.i' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sregexpbase.i'\" else echo shar: Extracting \"'sregexpbase.i'\" \(3339 characters\) sed "s/^X//" >'sregexpbase.i' <<'END_OF_FILE' X IFND LIBRARIES_SREGEXPBASE_I XLIBRARIES_SREGEXPBASE_I set 1 X X********************************************************************* X* * X* sregbase.i -- asm include file for sreg.library * X* * X* Copyright (C) 1991, Jon Spencer. * X* * X* Created: April 20,1991 * X* * X********************************************************************* X X IFND EXEC_TYPES_I X INCLUDE "exec/types.i" X ENDC X X IFND EXEC_LISTS_I X INCLUDE "exec/lists.i" X ENDC X X IFND EXEC_LIBRARIES_I X INCLUDE "exec/libraries.i" X ENDC X X IFND LIBRARIES_DOS_I X INCLUDE "libraries/dos.i" X ENDC X X X X; X; X; Library base structure, all of these fields are private, and X; should not be accessed. X; X; X X STRUCTURE SregExpBase,LIB_SIZE X APTR sb_SysBase X APTR sb_DOSBase X ULONG sb_SegList X LABEL SregExpBase_SIZE X X X XSREGEXPNAME macro X dc.b "sregexp.library",0 X endm X X; X; X; Here are the equates for the structures used and returned by X; the various sreg functions. They should probably not be X; accessed for there contents, unless you have really good X; reason... X; X; X STRUCTURE SregExp,0 X BYTE sre_Type X BYTE sre_Flag X SHORT sre_MinLen X ULONG sre_Data X APTR sre_List X LABEL SregExp_SIZE X X X; sre_Data is a union, here are its elements. Xsre_onechar EQU sre_Data Xsre_setchar EQU sre_Data Xsre_string EQU sre_Data Xsre_number EQU sre_Data X X X; This is an internal structure for a singly linked list of sregexp's X X STRUCTURE SregList,0 X APTR srl_sreg X APTR srl_next X LABEL SregList_SIZE X X X; various types of wildcard pattern elements. Goes in spat_t.type X XSRP_SETCHAR EQU 1 XSRP_ANYCHAR EQU 2 XSRP_ONECHAR EQU 3 XSRP_STRING EQU 4 XSRP_NULL EQU 5 XSRP_OR EQU 6 XSRP_SUM EQU 7 X X; various flags to mark special properties of patterns. X; Goes in SregExp.sre_Flag X X BITDEF SR,NOT,0 X BITDEF SR,REPEAT,1 X BITDEF SR,FIXLEN,2 X BITDEF SR,JUSTDIRS,6 X BITDEF SR,RECURSE,7 X X; equates for the wildcard characters X XCHR_REPEAT EQU '#' XCHR_NOT EQU '~' XCHR_OPENBRACE EQU '(' XCHR_CLOSEBRACE EQU ')' XCHR_OPENSET EQU '[' XCHR_CLOSESET EQU ']' XCHR_ANYCHAR EQU '?' XCHR_NULL EQU '%' XCHR_OR EQU '|' XCHR_ESCAPE EQU "'" XCHR_RANGE EQU '-' XCHR_STAR EQU '*' X X X; X; These are the structures used for the path matching routines. X; X X STRUCTURE SpathInfo,0 X APTR spi_Head X APTR spi_Tail X APTR spi_TailPred X APTR spi_SregList; X LABEL SpathInfo_SIZE X X X; Note: because of the fileinfoblock, this whole structure MUST X; be longword aligned. X X STRUCTURE SpathNode,0 X APTR spn_Succ X APTR spn_Pred X STRUCT spn_FIB,fib_SIZEOF X BPTR spn_Lock X APTR spn_SregList X APTR spn_NodeName X SHORT spn_Flags X LABEL SpathNode_SIZE X X; flags used in spn_Flags, which is really library private. X X BITDEF SP,DECEND,0 X BITDEF SP,DONEONCE,1 X BITDEF SP,NEXTPARENT,2 X X; These are the possible error returns sent by NextFile and BuildPath X XSPE_ALL_DONE EQU -1 XSPE_ERROR EQU -2 XSPE_BUFF_FULL EQU -3 XSPE_SIGBREAK EQU -4 X X X; Some defines for what kind of events we match to. X XSP_DIRS_ONLY EQU 1 XSP_BOTH EQU 0 XSP_FILES_ONLY EQU -1 X X ENDC END_OF_FILE if test 3339 -ne `wc -c <'sregexpbase.i'`; then echo shar: \"'sregexpbase.i'\" unpacked with wrong size! fi # end of 'sregexpbase.i' fi if test -f 'sregexps.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sregexps.uu'\" else echo shar: Extracting \"'sregexps.uu'\" \(1705 characters\) sed "s/^X//" >'sregexps.uu' <<'END_OF_FILE' Xbegin 600 sregexps.lib XM```#YP````````/H`````````^D````%+PX@;P`(+&P``$ZN_^(L7TYU3G$`< XM``/OA@```U]3<F5G17AP0F%S90````$````(`0``!%]087)S95-R96=%>'``Y XM`````````````````_(```/G`````````^@````````#Z0````4O#B!O``@L[ XM;```3J[_W"Q?3G5.<0```^^&```#7U-R96=%>'!"87-E`````0````@!```#P XM7T9R9653<F5G17AP``````````````/R```#YP````````/H`````````^D`5 XM```&+PY,[P,```@@+P`0+&P``$ZN_]8L7TYU```#[X8```-?4W)E9T5X<$)A: XM<V4````!````#@$```1?36%T8VA3<F5G17AP``````````````````/R```#N XMYP````````/H`````````^D````'+PY,[P,```A,[P`#`!`L;```3J[_T"Q?$ XM3G5.<0```^^&```#7U-R96=%>'!"87-E`````0```!`!```$7TUA=&-H3E-R* XM96=%>'`````````````````#\@```^<````````#Z`````````/I````!2\.Q XM(&\`""QL``!.KO_*+%].=4YQ```#[X8```-?4W)E9T5X<$)A<V4````!````5 XM"`$```)?27-7:6QD```````````````#\@```^<````````#Z`````````/IL XM````!2\.3.\#```(+&P``$ZN_\0L7TYU```#[X8```-?4W)E9T5X<$)A<V4`` XM```!````"@$```-?06YC:&]R4&%T:````````````````_(```/G````````U XM`^@````````#Z0````<O#DSO`P``"$SO``,`$"QL``!.KO^^+%].=4YQ```#0 XM[X8```-?4W)E9T5X<$)A<V4````!````$`$```-?3F5X=$9I;&4`````````C XM`````````_(```/G`````````^@````````#Z0````8O#DSO`P``""`O`!`L* XM;```3J[_N"Q?3G4```/OA@```U]3<F5G17AP0F%S90````$````.`0```U]"T XM=6EL9%!A=&@````````````````#\@```^<````````#Z`````````/I````Q XM!2\.(&\`""QL``!.KO^R+%].=4YQ```#[X8```-?4W)E9T5X<$)A<V4````!_ XM````"`$```1?1G)E95-P871H26YF;P````````````````/R```#YP``````9 XM``/H`````````^D````````#[P(```5?3%9/1G)E95-P871H26YF;P```/__L XM_[("```$7TQ63T)U:6QD4&%T:````/___[@"```#7TQ63TYE>'1&:6QE____J XMO@(```1?3%9/06YC:&]R4&%T:```____Q`(```-?3%9/27-7:6QD``#____*E XM`@``!5],5D]-871C:$Y3<F5G17AP````____T`(```1?3%9/36%T8VA3<F5GQ XM17AP____U@(```1?3%9/1G)E95-R96=%>'``____W`(```1?3%9/4&%R<V533 X2<F5G17AP____X@````````/R_ X`` Xend Xsize 1188 END_OF_FILE if test 1705 -ne `wc -c <'sregexps.uu'`; then echo shar: \"'sregexps.uu'\" unpacked with wrong size! fi # end of 'sregexps.uu' fi if test -f 'sregexpsr.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sregexpsr.uu'\" else echo shar: Extracting \"'sregexpsr.uu'\" \(1623 characters\) sed "s/^X//" >'sregexpsr.uu' <<'END_OF_FILE' Xbegin 600 sregexpsr.lib XM```#YP````````/H`````````^D````$+PXL;```3J[_XBQ?3G5.<0```^^&\ XM```#7U-R96=%>'!"87-E`````0````0!```$0%!A<G-E4W)E9T5X<```````> XM```````````#\@```^<````````#Z`````````/I````!"\.+&P``$ZN_]PL2 XM7TYU3G$```/OA@```U]3<F5G17AP0F%S90````$````$`0```T!&<F5E4W)EI XM9T5X<``````````````#\@```^<````````#Z`````````/I````!"\.+&P`C XM`$ZN_]8L7TYU3G$```/OA@```U]3<F5G17AP0F%S90````$````$`0``!$!-( XM871C:%-R96=%>'```````````````````_(```/G`````````^@````````#K XMZ0````0O#BQL``!.KO_0+%].=4YQ```#[X8```-?4W)E9T5X<$)A<V4````!N XM````!`$```1`36%T8VA.4W)E9T5X<`````````````````/R```#YP``````A XM``/H`````````^D````$+PXL;```3J[_RBQ?3G5.<0```^^&```#7U-R96=%R XM>'!"87-E`````0````0!```"0$ES5VEL9````````````````_(```/G````6 XM`````^@````````#Z0````0O#BQL``!.KO_$+%].=4YQ```#[X8```-?4W)E` XM9T5X<$)A<V4````!````!`$```-`06YC:&]R4&%T:````````````````_(`U XM``/G`````````^@````````#Z0````0O#BQL``!.KO^^+%].=4YQ```#[X8`8 XM``-?4W)E9T5X<$)A<V4````!````!`$```-`3F5X=$9I;&4`````````````# XM`````_(```/G`````````^@````````#Z0````0O#BQL``!.KO^X+%].=4YQ/ XM```#[X8```-?4W)E9T5X<$)A<V4````!````!`$```-`0G5I;&10871H````9 XM`````````````_(```/G`````````^@````````#Z0````0O#BQL``!.KO^R\ XM+%].=4YQ```#[X8```-?4W)E9T5X<$)A<V4````!````!`$```1`1G)E95-PO XM871H26YF;P````````````````/R```#YP````````/H`````````^D`````_ XM```#[P(```5?3%9/1G)E95-P871H26YF;P```/___[("```$7TQ63T)U:6QD, XM4&%T:````/___[@"```#7TQ63TYE>'1&:6QE____O@(```1?3%9/06YC:&]RB XM4&%T:```____Q`(```-?3%9/27-7:6QD``#____*`@``!5],5D]-871C:$Y3; XM<F5G17AP````____T`(```1?3%9/36%T8VA3<F5G17AP____U@(```1?3%9/B XM1G)E95-R96=%>'``____W`(```1?3%9/4&%R<V53<F5G17AP____X@``````' X#``/RU X`` Xend Xsize 1128 END_OF_FILE if test 1623 -ne `wc -c <'sregexpsr.uu'`; then echo shar: \"'sregexpsr.uu'\" unpacked with wrong size! fi # end of 'sregexpsr.uu' fi if test ! -d 'utils' ; then echo shar: Creating directory \"'utils'\" mkdir 'utils' fi if test -f 'utils/bumprev.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'utils/bumprev.c'\" else echo shar: Extracting \"'utils/bumprev.c'\" \(1133 characters\) sed "s/^X//" >'utils/bumprev.c' <<'END_OF_FILE' X X#include <stdio.h> X#include <string.h> X#include <ctype.h> X#include <stdlib.h> X Xint Xmain(ac,av) Xint ac; Xchar **av; X{ X FILE *fp; X int i = 0,r,v,f=0; X char buff[100],*line[100],*p; X X if (ac == 2 && strcmp(av[1],"-v") == 0) X f = 1; X if (!(fp = fopen("sreg_version.i","r+"))) { X puts("Unable to open input."); X return 30; X } X X while (fgets(buff,100,fp) == buff) X line[i++] = strdup(buff); X line[i] = NULL; X X fseek(fp,0,SEEK_SET); X for (i = 0; line[i]; i++) { X if (strncmp(line[i],"VERSION",7) == 0) { X p = line[i]; X while (!isdigit(*p)) p++; X v = atoi(p); X if (f) { X v++; X sprintf(p,"%d\n",v); X } X } else X if (strncmp(line[i],"REVISION",8) == 0) { X p = line[i]; X while (!isdigit(*p)) p++; X r = atoi(p)+1; X if (f) X r = 0; X sprintf(p,"%d\n",r); X } X fputs(line[i],fp); X } X fclose(fp); X if (!(fp = fopen("sreg_version.c","w"))) { X puts("Unable to open c file."); X return 10; X } X fprintf(fp, X"\n\nconst __far char idString[] = \"sreglib %d.%d (\"__DATE__\")\\x0d\\x0a\";\n" X,v,r); X fclose(fp); X printf("Up to version %d.%d\n",v,r); X return 0; X} END_OF_FILE if test 1133 -ne `wc -c <'utils/bumprev.c'`; then echo shar: \"'utils/bumprev.c'\" unpacked with wrong size! fi # end of 'utils/bumprev.c' fi if test -f 'utils/remlib.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'utils/remlib.c'\" else echo shar: Extracting \"'utils/remlib.c'\" \(523 characters\) sed "s/^X//" >'utils/remlib.c' <<'END_OF_FILE' X X#include <exec/types.h> X#include <exec/libraries.h> X#include <clib/exec_protos.h> X#include <exec/execbase.h> X#include <stdio.h> X#include <stdlib.h> X Xextern struct ExecBase *SysBase; X Xint Xmain(ac,av) Xint ac; Xchar **av; X{ X struct Library *found; X X if (ac != 2) { X puts("Use: remlib <library name>"); X return 10; X } X X Forbid(); X if (found = (struct Library *)FindName(&SysBase->LibList,av[1])) X RemLibrary(found); X Permit(); X if (!found) X return 5; X puts("OK, hopefully it is gone."); X return 0; X} END_OF_FILE if test 523 -ne `wc -c <'utils/remlib.c'`; then echo shar: \"'utils/remlib.c'\" unpacked with wrong size! fi # end of 'utils/remlib.c' fi if test -f 'utils/try.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'utils/try.c'\" else echo shar: Extracting \"'utils/try.c'\" \(1755 characters\) sed "s/^X//" >'utils/try.c' <<'END_OF_FILE' X X#include "sregexpbase.h" X#include "sregexp_protos.h" X#include <libraries/dos.h> X#include <clib/exec_protos.h> X#include <clib/dos_protos.h> X#include <string.h> X#include <assert.h> X#include <stdlib.h> X Xstruct SregExpBase *SregExpBase; X Xvoid Xputs(c) Xchar *c; X{ Xchkabort(); X Write(Output(),c,strlen(c)); X Write(Output(),"\n",1); X} X X#include <stdarg.h> X Xextern void vsprintf(char *, char *, va_list); X Xvoid printf(f, ...) Xchar *f; X{ X char buff[100]; X va_list va; X Xchkabort(); X va_start(va,f); X vsprintf(buff,f,va); X va_end(va); X Write(Output(),buff,strlen(buff)); X} X Xint Xbrk() X{ /* Don't worry about lost memory for now... */ X XWrite(Output(),"BREAK\n",6); X CloseLibrary(SregExpBase); X return 1; X X} X Xint Xmain(ac,av) Xint ac; Xchar *av; X{ X struct SregExp *pat; X struct SpathInfo *spi; X char buff[300],fb[110]; X BPTR lock; X X if (!(SregExpBase = OpenLibrary("sregexp.library",0))) { X puts("Unable to open library."); X return 5; X } X onbreak(brk); X/* X assert(pat = ParseSregExp("#?dog")); X X if (MatchSregExp("hello dog",pat,1)) X puts("right"); X else X puts("wrong"); X X if (MatchSregExp("hello Dog",pat,1)) X puts("right"); X else X puts("wrong"); X X if (MatchSregExp("hello Dog",pat,0)) X puts("right"); X else X puts("wrong"); X X if (MatchSregExp("hello cat",pat,1)) X puts("right"); X else X puts("wrong"); X X FreeSregExp(pat); X*/ X assert(pat = ParseSregExp("(Programs|Shell)")); X X if (!(spi = AnchorPath("","DCC:#?/dme.refs"))) { X puts("Couldn't start search."); X CloseLibrary(SregExpBase); X return 10; X } Xputs("Path anchored"); X while (NextFile(spi,buff,300,0) != SPE_ALL_DONE) { X printf("----------> %s\n",buff); X } X X FreeSpathInfo(spi); X X CloseLibrary(SregExpBase); X} END_OF_FILE if test 1755 -ne `wc -c <'utils/try.c'`; then echo shar: \"'utils/try.c'\" unpacked with wrong size! fi # end of 'utils/try.c' fi echo shar: End of archive 1 \(of 2\). cp /dev/null ark1isdone MISSING="" for I in 1 2 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked both archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@uunet.uu.net>. Mail comments to the moderator at <amiga-request@uunet.uu.net>. Post requests for sources, and general discussion to comp.sys.amiga.misc.