Thanks to both of you for your help! I have got it going now. A few lines of sample code in the manual would of gone a long way...but hey that's what the neighborhood LUG is for. Turns out I had a misplaced "struct" keyword. I was working from my other main experience with system structs (besides sockets) and that is with the tm struct used for time functions. Whenever I declare it for use, I include the "struct" keyword in the declaration, for example: struct tm *tstruct; But I guess that is not how it is done for the regex library... Anyway -- thanks. On Mon, 19 Feb 2001 22:52:34 Kevin Buettner wrote: > On Feb 19, 6:06pm, Julian M Catchen wrote: > > > Ok, I was confused, the rx library is included by default in glibc. > The > > problem I am having is the following: > > > > To use the regex functions, I have to create a structure, regex_t. If > i > > just declare it like this: > > > > struct regex_t rx; > > > > The compiler errors out saying "storage size of `rx' isn't known". > > > > Can anyone give me some pointers on how to malloc this thing? > > Do you have a ``#include '' statement prior to your > declaration for ``rx''? > > Below is a simple program which demonstrates the use of the functions > documented on the recomp() man page. To try it, put it in a file > called simple-grep.c and do the following: > > ocotillo:ctests$ gcc -Wall -o simple-grep -g simple-grep.c > ocotillo:ctests$ ./simple-grep 'reg(exec|comp)' Line 21: errcode = regcomp (&rx, argv[1], REG_EXTENDED | REG_NOSUB); > Line 37: if (regexec (&rx, line, 0, 0, 0) == 0) > > --- simple-grep.c --- > #include > #include > #include > > #define MAXLINESIZE 4096 > > int > main (int argc, char **argv) > { > regex_t rx; > int errcode; > char line[MAXLINESIZE]; > int linenum; > > if (argc != 2) > { > fprintf (stderr, "Usage: $s pattern\n"); > exit (1); > } > > errcode = regcomp (&rx, argv[1], REG_EXTENDED | REG_NOSUB); > if (errcode != 0) > { > char *buf; > size_t bufsize; > > bufsize = regerror (errcode, &rx, 0, 0); > buf = alloca (bufsize); > regerror (errcode, &rx, buf, bufsize); > fprintf (stderr, "Error compiling pattern: %s\n", buf); > exit (1); > } > > linenum = 1; > while (fgets (line, MAXLINESIZE, stdin)) > { > if (regexec (&rx, line, 0, 0, 0) == 0) > { > printf ("Line %d: %s", linenum, line); > if (line[strlen (line) - 1] != '\n') > printf ("\n"); > } > > if (strlen (line) != MAXLINESIZE - 1 || line[MAXLINESIZE - 2] == > '\n') > linenum++; > } > > regfree (&rx); > exit (0); > } > --- end simple-grep.c --- > > By way of comparison the above C program is roughly comparable to the > following perl program: > > --- simple-grep.pl --- > #!/usr/bin/perl -w > > $pattern = shift; > > while (<>) { > chomp; > print "$ARGV, $.:$_\n" if /$pattern/; > } > --- end simple-grep.pl --- > > Actually, the perl solution is superior since it is capable of reading > from files whose names are supplied from the command line as well as > STDIN. Also, it deals with long lines much less clumsily. > > Here's example of the perl program in action: > > ocotillo:ctests$ ./simple-grep.pl 'reg(exec|comp)' -, 21: errcode = regcomp (&rx, argv[1], REG_EXTENDED | REG_NOSUB); > -, 37: if (regexec (&rx, line, 0, 0, 0) == 0) > ocotillo:ctests$ ./simple-grep.pl 'reg(exec|comp)' simple-grep.c > simple-grep.c, 21: errcode = regcomp (&rx, argv[1], REG_EXTENDED | > REG_NOSUB); > simple-grep.c, 37: if (regexec (&rx, line, 0, 0, 0) == 0) > > HTH, > > Kevin > > ________________________________________________ > See http://PLUG.phoenix.az.us/navigator-mail.shtml if your mail doesn't > post to the list quickly and you use Netscape to write mail. > > Plug-discuss mailing list - Plug-discuss@lists.PLUG.phoenix.az.us > http://lists.PLUG.phoenix.az.us/mailman/listinfo/plug-discuss > > --