Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Oct 2009 10:06:34 -0700
From:      Gary Kline <kline@thought.org>
To:        Brad Mettee <bmettee@pchotshots.com>
Cc:        FreeBSD Mailing List <freebsd-questions@freebsd.org>
Subject:   Re: need C help, passing char buffer[] by-value....
Message-ID:  <20091019170634.GA12371@thought.org>
In-Reply-To: <4ADBFDBA.6040702@pchotshots.com>
References:  <20091019013337.GA9522@thought.org> <4ADBFDBA.6040702@pchotshots.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Oct 19, 2009 at 01:48:42AM -0400, Brad Mettee wrote:
> Gary Kline wrote:
> >Guys,
> >
> >maybe this can't be done reading in a file with fgets(buffer[128], fp),
> >then calling skiptags(), conditionally, to while () past ',' and '>'.
> >
> >I know I need to calll skipTags with its address, skipTags(&buffer);, but 
> >then how to i
> >handle the variable "s" in skipTags?  Anybody?
> >
> >
> >
> >
> >// redo, skip TAGS
> >skipTags((char *)&s)
> >{
> >        if (*s == '<')
> >        {
> >                while (*s != '>')
> >                {
> >                        s++;
> >                }
> >                s++;
> >        }
> >}
> >  
> Your function may not work exactly as you think it will. Your basic idea 
> runs on the assumption that the tag will never be broken during the file 
> read. It's possible that you'll read "some data<Tag begin" and the next 
> read will have ">more data here<tag ends>", or some variation thereof. 
> If you know for a fact that the string you read in will always be 
> complete, then what's below should work fine:
> 
> // where *s is the address of a string to be parsed
> // maxlen represents the maximum number of chars potentially in the string 
> and is not zero based (ie: maxlen 256 = char positions 0-255)
> // *curpos is the current position of the pointer (this prevents bounds 
> errors)
> skipTags(char *s, long maxlen, long *curpos)
> {
>        if (*s == '<')
>        {
>                while (*s != '>' && && *s && *curpos < maxlen)
>                {
>                        s++;
> 			(*curpos)++;
>                }
> 		if (*curpos < maxlen)
> 		{
> 	                s++;
> 			(*curpos)++;
> 		}
>        }
> }
> 
> When you read in the next line of the file, reset curpos to zero, set 
> maxlen to number of bytes read. As you process each char after the 
> function is called, you'll need to increment curpos as well.
> 
> Depending on the size of the files you are reading, you may be able to 
> read the entire file into memory at once and avoid any possible TAG 
> splitting.
> 
> If you explain exactly what you're trying to accomplish, we may be able 
> to come up with an easier/cleaner solution.
> 
> (warning: none of the above code is tested, but in concept it should 
> work ok)
> 

	It didn't core dump, but neither work.  Basically, I'm doing a read via fgets:

	"while(fgets(buf, sizeof buf, fp_in)) {"

	an HTML or other file with <TAGS>.  Optionally, say, given the switch -N,
	the program would NOT progress any of the HTML tags; It would only touch other
	stuff in the file.  Simply put, I have a fixed buffer, buf[1024], that I want to
	change --i think by-reference-----not certain-----by calling 

	skiptags(*&buf); and skiptags() would read past the <WHATEVER="7" FOO="6" BAR="Times">
	and return the buffer to the place after fgets() where skiptags(&buf) is called
	missing all markup <TAGS>.

	I'm better at by-refernce with ints that chars, so I don't know how far off I am
	here.  That's why I;'m asking you guys.

	gary



-- 
 Gary Kline  kline@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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20091019170634.GA12371>