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

Reply via email to