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>