Date: Tue, 9 Jun 2009 16:40:39 -0700 From: Gary Kline <kline@thought.org> To: Jeffrey Goldberg <jeffrey@goldmark.org> Cc: FreeBSD Questions <freebsd-questions@freebsd.org> Subject: Re: flaw found [in my own program] Message-ID: <20090609234039.GB11209@thought.org> In-Reply-To: <0F5E9DB6-2342-46E0-B5AB-7BB70837FEF6@goldmark.org> References: <20090609001529.GA7166@thought.org> <0F5E9DB6-2342-46E0-B5AB-7BB70837FEF6@goldmark.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Jun 09, 2009 at 06:19:21PM -0500, Jeffrey Goldberg wrote:
> On Jun 8, 2009, at 7:15 PM, Gary Kline wrote:
>
> > not surprisingly, i found a fla w in my getc(fp) program that
> > tried to read past "<?" and "?>" ... the example i added to my
> > test file was simply the 2 bytes "<" and "?". so if you have a
> > stray
> >
> > "<?"
> >
> > with a matching close case, the binary hangs on a read.
> > so, again, can anybody suggest a better example, in C, to get
> > past two delimiters?
>
> Back in the days when I taught introductory C programming, one the the
> early homework assignments was to write a filter that would strip C-
> style comments. As a follow-up they had to do this allowing for
> nested comments.
>
> I don't think I can recover things from the back-up tapes that I have
> for that corse material, but the approach I directed people toward was
> to have a variable, let's call it status that records one of four states
>
> OUTSIDE /* just reading normally, not in the material to be striped
> */
> AFTER_LT /* You've read in a '<' and are looking for a '?' */
> INSIDE /* You are in the material to be stripped */
> AFTER_Q /* You are in the material to be stripped and have just
> read a '?' */
>
> then use a switch statement on the character you are reading in.
>
> switch(c) {
> case '<': ...
> case '?': ...
> case '>': ...
> case EOF: ...
> default: ...
> }
>
> In each case, you look at the current state, decide whether the write
> 'c' to output and what state to change to. The most common mistake
> students would make would be to forget the EOF case. I suspect that
> you may have done the same.
>
> -j
:-)
yup, this is definitely better that initial approach. i have improved my
function to return a 1 after "?", 2 after a "?>" and a 3 if both are
found. i still think my function hangs in an loop if only the opening php
token is found.
thanks for the idea!
gary
>
--
Gary Kline kline@thought.org http://www.thought.org Public Service Unix
http://jottings.thought.org http://transfinite.thought.org
For FBSD list: http://transfinite.thought.org/slicejourney.php
The 4.91a 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?20090609234039.GB11209>
