need C help, passing char buffer[] by-value....
Gary Kline
kline at thought.org
Mon Oct 19 22:21:32 UTC 2009
On Mon, Oct 19, 2009 at 11:09:19AM -0700, Patrick Mahan wrote:
> See comments interspaced below -
>
> Gary,
>
> Let me restate your problem: You want to read through a file containing tags
> delimited by "<>" and to skip these tags if the user has run your command
> with
> the "-N" flag.
>
> In C any thing passed by address is "by reference". For a your static
> buffer
> of 1024 characters: you can pass it by reference as:
>
> skiptags(buf); /* passes in the starting address of the buffer */
> skiptags(&buf[0]); /* passes in the starting address of the
> buffer */
> skiptags(&buf[10]); /* passes int the starting address of the
> buffer
> at the 11th character position. */
>
> Arrays and pointers are always by reference. Individual data types "int",
> "char", etc are by value unless passed in as a pointer. I think this is
> where
> your confusion is around.
You've got it exactly right, Patrick. There were no "C" classes in 1978--I
taught myself. Obviously, not that well because I have already dreaded
pointers. ---Well, usually.
>
> A couple of things to keep in mind:
>
> 1. Remember how fgets() works. It is entirely possible that you might
> have
> tags that span multiple lines. You will need to take that into
> account.
>
> 2. You can manipulate the fixed buffer two different ways:
>
> A. You can use pointer arithemtic, eg.
>
> char buf[1024];
> char *cp;
>
> while ((cp = fgets(buf, sizeof(buf), fp_in))) {
>
> if (skiptags) cp = skiptag(buf);
>
> /* If NULL, end of line reached */
> if (!cp) continue;
>
> }
>
> char *skiptags(char *buf)
> {
> char *tp = buf;
>
> /* find the start of a tag */
> while (*tp != '\0' && *tp++ != '<');
>
> /* if no tag is found return start of buffer */
> if (*tp == '\0')
> return buf;
>
> /* Start of tag, find the end of tag */
> while (*tp != '\0' && *tp != '\n' && *tp++ != '>');
>
> /* if end of line reached return NULL */
> if (*tp == '\0' || *tp == '\n')
> return NULL;
>
> /* return the next character start after the end tag */
> return ++tp;
> }
>
> B. Using indexing, eg.
>
> char buf[1024];
> int i, bsize;
>
> while (fgets(buf, sizeof(buf), fp_in)) {
> i = 0;
> bsize = strlen(buf);
>
> if (skiptags) i = skiptag(buf);
>
> /* If NULL, end of line reached */
> if (i >= bsize) continue;
>
> }
>
> int skiptags(char *buf)
> {
> int c = 0;
>
> /* find the start of a tag */
> while (buf[c] != '\0' && buf[c] != '<')
> c++;
>
> /* if no tag is found return start of buffer */
> if (buf[c] == '\0')
> return 0;
>
> /* Start of tag, find the end of tag */
> while (buf[c] != '\0' && buf[c] != '\n' && buf[c] != '>')
> c++;
>
> /* if end of line reached return NULL */
> if (buf[c] == '\0' || buf[c] == '\n')
> return strlen(buf);
>
> /* return the next character start after the end tag */
> return ++c;
> }
>
> Both methods should allow you to skip past any tags found in the file
> (provided
> you handle the case of a tag spanning more than one line).
>
>
> Hope this clears up your confusion and gets you on your way.
Your examples help a lot! Everything works except when there are two or more
tags on one line such as:
<BODY BGCOLOR="#FFFFFF" LINK="#00FFFF" VLINK="#006633"><FONT SIZE="4">
I think I see where is your skiptags--pointer arithematic function--this can be
caught. Thanks much!
:-)
gary
>
> Patrick
> _______________________________________________
> freebsd-questions at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-questions
> To unsubscribe, send any mail to "freebsd-questions-unsubscribe at freebsd.org"
--
Gary Kline kline at thought.org http://www.thought.org Public Service Unix
http://jottings.thought.org http://transfinite.thought.org
The 7.31a release of Jottings: http://jottings.thought.org/index.php
More information about the freebsd-questions
mailing list