Skip site navigation (1)Skip section navigation (2)
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>