Ah I see, the return 0 should be there, but you had missed an
else before it.

> >       if (')'==c) {
> >         if (0!=rparen++) return 0;
> >       } else
> >       return 0;
> >     }
> >     return 1;

everything works fine now. Thanks.

Вт, 27 дек 2016, Raul Miller написал(а):
> I do not know what values were returned for the "failed" cases, and I
> should have that if I'm going to debug your c#. (Since I don't have c#
> installed on this machine.)
> 
> That said, the return 0; in scriptclose belongs there: If there's any
> characters on a line other a line other than whitespace or ) then the
> line is not a scriptclose line.
> 
> Try putting that back and seeing if that fixes things for you?
> 
> Thanks,
> 
> -- 
> Raul
> 
> 
> On Tue, Dec 27, 2016 at 4:01 AM, bill lam <[email protected]> wrote:
> > My c# transliteration from your c code. Not sure if I had done
> > it correctly.
> >
> > the return 0 inside scriptclose seemed shouldn't be there.
> > I tested it works with some success and some failures
> > aa)       failed
> > aa))      ok
> > aa())     ok
> >
> > single ")" (non-scriptclose) doesn't work
> >
> > aa(     failed
> > aa((    failed
> > aa(((   failed
> > aa(()   failed
> > aa((()  failed
> > aa((()) ok
> >
> > it seems "(" requires at least 2 ")" to work.
> >
> > Handling of contexts for inside string and after NB. seems
> > working correctly.
> >
> > c#:
> >   int scriptclose(string line, int len)
> >   {
> >     int rparen= 0;
> >     for (int j= 0; j<len; j++) {
> >       char c= line[j];
> >       if (' '==c) continue;
> >       if ('\t'==c) continue;
> >       if (')'==c) {
> >         if (0!=rparen++) return 0;
> >       }
> > //        return 0;
> >     }
> >     return 1;
> >   }
> >
> >   int firstunmatched(string line, int len)
> >   {
> >     if (0==len || 0!=scriptclose(line, len)) return len;
> >     int depth= 0;
> >     int nb= 0;
> >     int unquoted= 1;
> >     int uncommented= 1;
> >     int r= len;    /* first unmatched ) */
> >     int l= len;     /* first unmatched ( */
> >     int[] d=new int[len];
> >     for (int j= 0; j<len; j++) {
> >       char c= line[j];
> >       if ('\''==c) unquoted= (0==unquoted)?1:0;
> >       if (unquoted!=0 && uncommented!=0) {
> >         if ('('==c) depth++; /* find paren depth */
> >         else if (')'==c) depth--;
> >         if (-1==depth && r==len) r=j; /* find first unmatched ) */
> >         if (0==nb && 'N'==c) nb=1; /* find comment start */
> >         else if (1==nb && 'B'==c) nb=2;
> >         else if (2==nb && '.'==c) uncommented= 0;
> >         else nb= 0;
> >       }
> >       d[j]= depth;
> >     }
> >     if (0 < d[len-1]) {
> >       int prev= 0;
> >       for (int j= 0; j<r; j++) {
> >         if (0 ==prev && 1==d[j]) {
> >           l= j;
> >         }
> >         prev= d[j];
> >       }
> >       return l;
> >     }
> >     return r;
> >   }
> >
> >
> > Вт, 27 дек 2016, Raul Miller написал(а):
> >> Ok, here's a translation to C. Some variable names changed. Lightly tested:
> >>
> >> int scriptclose(char *line, unsigned int len) {
> >>     int rparen= 0;
> >>     for (unsigned int j= 0; j<len; j++) {
> >>         char c= line[j];
> >>         if (' '==c) continue;
> >>         if ('\t'==c) continue;
> >>         if (')'==c) {
> >>             if (rparen++) return 0;
> >>         }
> >>         return 0;
> >>     }
> >>     return 1;
> >> }
> >>
> >> int firstunmatched(char *line, unsigned int len) {
> >>     if (0==len || scriptclose(line, len)) return len;
> >>     int depth= 0;
> >>     int nb= 0;
> >>     int unquoted= 1;
> >>     int uncommented= 1;
> >>     int r= len;    /* first unmatched ) */
> >>     int l= len;     /* first unmatched ( */
> >>     int d[len];
> >>     for (unsigned int j= 0; j<len; j++) {
> >>         char c= line[j];
> >>                 if ('\''==c) unquoted=!unquoted;
> >>         if (unquoted && uncommented) {
> >>             if ('('==c) depth++; /* find paren depth */
> >>             else if (')'==c) depth--;
> >>             if (-1==depth && r==len) r=j; /* find first unmatched ) */
> >>             if (0==nb && 'N'==c) nb=1; /* find comment start */
> >>             else if (1==nb && 'B'==c) nb=2;
> >>             else if (2==nb && '.'==c) uncommented= 0;
> >>             else nb= 0;
> >>         }
> >>         d[j]= depth;
> >>     }
> >>     if (0 < d[len-1]) {
> >>         int prev= 0;
> >>         for (unsigned int j= 0; j<r; j++) {
> >>             if (0 ==prev && 1==d[j]) {
> >>                 l= j;
> >>             }
> >>             prev= d[j];
> >>         }
> >>         return l;
> >>     }
> >>     return r;
> >> }
> >>
> >> Results should match that of:
> >>
> >> firstunmatched=:3 :0
> >>   if. ')' -:&(-.&' ') y do. #y return. end.
> >>   q=. unquoted=. -.~:/\y=''''
> >>   c=. uncommented=. -. +./\ q * 'NB.' E. y
> >>   n=. parendepth=. +/\q*c*-/'()'=/y
> >>   if. 0 < {: n do.
> >>     (n i. _1) <. 1 i:~0 1 E. 0,n
> >>   else.
> >>     n i. _1
> >>   end.
> >> )
> >>
> >> I hope this helps,
> >>
> >> --
> >> Raul
> >>
> >> On Mon, Dec 26, 2016 at 11:18 PM, bill lam <[email protected]> wrote:
> >> > The firstunmatched verb needs to run only on visible
> >> > portion of text and I think it should be fast enough, but
> >> > it requires some effort to translate the scan operator to
> >> > its equivalent in c or c#.
> >> >
> >> > --
> >> > regards,
> >> > ====================================================
> >> > GPG key 1024D/4434BAB3 2008-08-24
> >> > gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
> >> > gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
> >> > ----------------------------------------------------------------------
> >> > For information about J forums see http://www.jsoftware.com/forums.htm
> >> ----------------------------------------------------------------------
> >> For information about J forums see http://www.jsoftware.com/forums.htm
> >
> > --
> > regards,
> > ====================================================
> > GPG key 1024D/4434BAB3 2008-08-24
> > gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
> > gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
> > ----------------------------------------------------------------------
> > For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm

-- 
regards,
====================================================
GPG key 1024D/4434BAB3 2008-08-24
gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to