Annotation of 43BSD/contrib/icon/operators/tabmat.c, revision 1.1.1.1

1.1       root        1: #include "../h/rt.h"
                      2: 
                      3: /*
                      4:  * =x - tab(match(x)).
                      5:  * Reverses effects if resumed.
                      6:  */
                      7: 
                      8: tabmat(nargs, oldsubj, arg1, arg0)
                      9: int nargs;
                     10: struct descrip oldsubj, arg1, arg0;
                     11:    {
                     12:    DclSave
                     13:    register int l;
                     14:    register char *s1, *s2;
                     15:    int i, j;
                     16:    char sbuf[MAXSTRING];
                     17: 
                     18:    SetBound;
                     19:    /*
                     20:     * x must be a string.
                     21:     */
                     22:    if (cvstr(&arg1,sbuf) == NULL)
                     23:       runerr(103, &arg1);
                     24: 
                     25:    /*
                     26:     * Make a copy of &subject and &pos.
                     27:     */
                     28:    oldsubj = k_subject;
                     29:    i = k_pos;
                     30:    
                     31:    /*
                     32:     * Fail if &subject[&pos:0] is not of sufficient length to contain x.
                     33:     */
                     34:    j = STRLEN(k_subject) - i + 1;
                     35:    if (j < STRLEN(arg1))
                     36:       fail();
                     37: 
                     38:    /*
                     39:     * Get pointers to x (s1) and &subject (s2).  Compare them on a bytewise
                     40:     *  basis and fail if s1 doesn't match s2 for *s1 characters.
                     41:     */
                     42:    s1 = STRLOC(arg1);
                     43:    s2 = STRLOC(k_subject) + i - 1;
                     44:    l = STRLEN(arg1);
                     45:    while (l-- > 0) {
                     46:       if (*s1++ != *s2++)
                     47:          fail();
                     48:       }
                     49: 
                     50:    /*
                     51:     * Increment &pos to tab over the matched string and suspend the
                     52:     *  matched string.
                     53:     */
                     54:    l = STRLEN(arg1);
                     55:    k_pos += l;
                     56:    arg0 = arg1;
                     57:    suspend();
                     58: 
                     59:    /*
                     60:     * tabmat has been resumed, restore &subject and &pos and fail.
                     61:     */
                     62:    k_subject = oldsubj;
                     63:    k_pos = i;
                     64:    fail();
                     65:    }
                     66: 
                     67: Opblockx(tabmat,2,"=",1)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.