On Tue, Jun 16, 2009 at 08:30:40AM -0700, Gary Kline wrote:
> On Mon, Jun 15, 2009 at 06:57:45PM -0800, Mel Flynn wrote:
> > On Monday 15 June 2009 17:21:16 Gary Kline wrote:
> > 
> > > Encl: dephp.c, test
> >          case '?':
> >             ch = getchar();
> >             while (1)
> >             {
> >                if (ch == '?' && (ch = getchar()) == '>')
> >                {
> >                   break;
> >                } 
> >                else
> >                {
> >                   ch = getchar();
> >                }
> >             }
> >             break;
> > 
> > As has been hinted before you're not handling the EOF case. Files like:
> > <?php
> > class foo
> > {
> >     function __construct() { echo 'foo'; };
> > };
> > 
> > Are perfectly valid php files and actually preferred for included files, 
> > rather then a terminating ?>, because one can start filling the output by 
> > trailing whitespace before EOF and thus not set any header() anymore. The 
> > above code will wait indefinitely for the next char or spin like mad if 
> > you're 
> > using non-blocking IO.
> 
> 
>       YUP.
> 
>       I thought my initial getchar() != EOF would handle that.  
>       But then there's that do-forever loop.  I remember Jeffrey's
>       post and tried a case 'EOF' or case '-1';  thar gives me
>       compiler errors.  
> 
>       Suggestions?
> 
> 
> > 
> > You should really take the pointers from Jeffrey Goldberg and record states 
> > and decide based on the state, rather then inlined switch statements, if 
> > only 
> > for readability.
> > 
> > You're also in trouble with <?xml, but that's an entirely different beast 
> > and 
> > you might actually be doing the right thing from your usage perspective.
> > -- 
> > Mel


        this works, but still gives a warning.  it's sloppy coding, but
        as a second version... 

        gary


#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
   FILE           *fp;
   int results=0;

   *argv++;

   if ((fp = fopen(*argv, "r")) == NULL)
      exit(printf("[%s] not found\n", *argv));
   else
      results = foo(fp);

   printf("\nend of main(), %s, results = [%d]\n", __FILE__, results);

}

int 
foo(FILE *fp)
{
   int ch;
   do
   {
      if ((ch = getc(fp)) != EOF)
      switch (ch)
      {
      case 'EOF':
        feof(fp);
        exit(0);
      case '>':
         putchar (ch);
         break;
      case '<':
         putchar (ch);
         switch ((ch = getc(fp)) )
         {
         case '?':
            ch = getc(fp);
            while ( (ch = getc(fp)) != EOF)
            {
               if (ch == '?' && (ch = getc(fp)) == '>' )
               {
                  break;
               } 
               else
               {
                  ch = getc(fp);
               }
            }
            break;
      case '>':
         putchar (ch);
         break;
         default:
            putchar(ch);
            break;
         }
         break;
      default:
         putchar (ch);
      }
   }
   while (ch != EOF);

        return 0;
}

_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "freebsd-questions-unsubscr...@freebsd.org"

Reply via email to