|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.