1: #include "../h/rt.h"
2:
3: /*
4: * escan - restore &subject and &pos at the end of a scanning expression.
5: *
6: * Arguments:
7: * arg1 - value being scanned
8: * arg2 - old value of &subject
9: * arg3 - old value of &pos
10: * arg4 - result of the scanning expression
11: *
12: * The result of the scanning expression is dereferenced if it refers to &subject
13: * or &pos, then copied to the first argument (the last three will
14: * be popped when escan returns). Then the previous values of &subject
15: * and &pos are restored.
16: *
17: * Escan suspends once it has restored the old &subject; on failure
18: * the new &subject and &pos are "unrestored", and the failure is
19: * propagated into the using clause.
20: */
21:
22: escan(nargs, arg4, arg3, arg2, arg1)
23: int nargs;
24: struct descrip arg4, arg3, arg2, arg1;
25: {
26: DclSave
27: struct descrip tmp;
28:
29: SetBound;
30:
31: /*
32: * If the result of the scanning expression is &subject or &pos,
33: * it is dereferenced.
34: */
35: if (arg4.type == D_VAR && (int)BLKLOC(arg1) == (int)&k_subject)
36: DeRef(arg4)
37: if (arg4.type == D_TVPOS)
38: DeRef(arg4)
39:
40: /*
41: * Copy the result of the scanning expression into arg1, which will
42: * be the result of the scan.
43: */
44: arg1 = arg4;
45:
46: /*
47: * Swap new and old values of &subject, leaving the new value in arg2.
48: */
49: tmp = k_subject;
50: k_subject = arg2;
51: arg2 = tmp;
52:
53: /*
54: * Swap new and old values of &pos, leaving the new value in arg3.
55: */
56: tmp = arg3;
57: INTVAL(arg3) = k_pos;
58: k_pos = INTVAL(tmp);
59:
60: /*
61: * Suspend the value of the scanning expression.
62: */
63: suspend();
64:
65: /*
66: * Upon resumption, restore the new values for &subject and &pos
67: * and fail.
68: */
69: k_subject = arg2;
70: k_pos = INTVAL(arg3);
71:
72: fail();
73: }
Defined functions
escan
defined in line
22;
never used