Annotation of 43BSD/contrib/icon/rt/mksubs.c, revision 1.1.1.1

1.1       root        1: #include "../h/rt.h"
                      2: 
                      3: /*
                      4:  * mksubs - form a substring.  var is a descriptor for the string from
                      5:  *  which the substring is to be formed.  var may be a variable.  val
                      6:  *  is a dereferenced version of val.  The descriptor for the resulting
                      7:  *  substring is placed in *result.  The substring starts at position
                      8:  *  i and extends for j characters.
                      9:  */
                     10: 
                     11: struct descrip mksubs(var, val, i, j, result)
                     12: register struct descrip *var, *val, *result;
                     13: int i, j;
                     14:    {
                     15:    extern struct b_tvsubs *alcsubs();
                     16: 
                     17:    if (QUAL(*var) || !VAR(*var)) {
                     18:       /*
                     19:        * var isn't a variable, just form a descriptor that points into
                     20:        *  the string named by val.
                     21:        */
                     22:       STRLEN(*result) = j;
                     23:       STRLOC(*result) = STRLOC(*val) + i - 1;
                     24:       return;
                     25:       }
                     26: 
                     27:    if (TVAR(*var)) {
                     28:       /*
                     29:        * var is a trapped variable.  If it is a substring trapped variable,
                     30:        *  adjust the position and make var the substrung string.  For other
                     31:        *  trapped variables, don't do anything.
                     32:        */
                     33:       switch (TYPE(*var)) {
                     34:          case T_TVSUBS:
                     35:             i += BLKLOC(*var)->tvsubs.sspos - 1;
                     36:             var = &BLKLOC(*var)->tvsubs.ssvar;
                     37:             break;
                     38: 
                     39:          default:
                     40:             break;
                     41:          }
                     42:       }
                     43: 
                     44:    /*
                     45:     * Make a substring trapped variable by passing the buck to alcsubs.
                     46:     */
                     47:    result->type = D_TVSUBS;
                     48:    BLKLOC(*result) = (union block *) alcsubs(j, i, var);
                     49:    return;
                     50:    }

unix.superglobalmegacorp.com

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