|
|
1.1 root 1: /***************************************************************************
2: * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne. JOVE *
3: * is provided to you without charge, and with no warranty. You may give *
4: * away copies of JOVE, including sources, provided that this notice is *
5: * included in all the files. *
6: ***************************************************************************/
7:
8: #include "jove.h"
9: #include <ctype.h>
10:
11: private void
12: gather_numeric_argument proto((int)),
13: quad_numeric_arg proto((void));
14:
15: int arg_supplied_p,
16: arg_count;
17:
18: /* called by C-U to gather a numeric argument, either C-U's or digits,
19: but not both */
20:
21: void
22: TimesFour()
23: {
24: quad_numeric_arg();
25: }
26:
27: /* This initializes the numeric argument to 1 and starts multiplying
28: by 4 (the magic number Stallman came up with). It is an error to
29: invoke quad_numeric_arg() interactively (via TimesFour()), because
30: it uses the LastKeyStruck variable to know what character signals
31: to multiply again (in the loop). */
32: private void
33: quad_numeric_arg()
34: {
35: int oldc = LastKeyStruck,
36: newc,
37: narg_count,
38: slow;
39:
40: slow = NO;
41: arg_supplied_p = YES;
42: arg_count = 1;
43: this_cmd = ARG_CMD;
44: do {
45: if ((narg_count = arg_count * 4) != 0)
46: arg_count = narg_count;
47: newc = waitchar(&slow);
48: if (isdigit(newc) || newc == '-') {
49: arg_supplied_p = NO;
50: gather_numeric_argument(newc);
51: return;
52: }
53: } while (newc == oldc);
54: Ungetc(newc);
55: }
56:
57: private void
58: gather_numeric_argument(c)
59: int c;
60: {
61: int sign = 0;
62: static int digited;
63: int slow = NO;
64:
65: if (!isdigit(c) && c != '-')
66: complain((char *) 0);
67: if (arg_supplied_p == NO) { /* if we just got here */
68: arg_count = 0; /* start over */
69: digited = NO;
70: } else if (arg_supplied_p == YES_NODIGIT) {
71: sign = (arg_count < 0) ? -1 : 1;
72: arg_count = 0;
73: }
74:
75: if (!sign)
76: sign = (arg_count < 0) ? -1 : 1;
77: if (sign == -1)
78: arg_count = -arg_count;
79: if (c == '-') {
80: sign = -sign;
81: goto goread;
82: }
83: for (;;) {
84: if (isdigit(c)) {
85: arg_count = (arg_count * 10) + (c - '0');
86: digited = YES;
87: } else {
88: if (digited)
89: arg_supplied_p = YES;
90: else {
91: arg_count = 1;
92: if (arg_supplied_p == NO)
93: arg_supplied_p = YES_NODIGIT;
94: }
95: arg_count *= sign;
96: this_cmd = ARG_CMD;
97: Ungetc(c);
98: return;
99: }
100: goread: c = waitchar(&slow);
101: }
102: }
103:
104: void
105: Digit()
106: {
107: gather_numeric_argument(LastKeyStruck);
108: }
109:
110: void
111: Digit0()
112: {
113: gather_numeric_argument('0');
114: }
115:
116: void
117: Digit1()
118: {
119: gather_numeric_argument('1');
120: }
121:
122: void
123: Digit2()
124: {
125: gather_numeric_argument('2');
126: }
127:
128: void
129: Digit3()
130: {
131: gather_numeric_argument('3');
132: }
133:
134: void
135: Digit4()
136: {
137: gather_numeric_argument('4');
138: }
139:
140: void
141: Digit5()
142: {
143: gather_numeric_argument('5');
144: }
145:
146: void
147: Digit6()
148: {
149: gather_numeric_argument('6');
150: }
151:
152: void
153: Digit7()
154: {
155: gather_numeric_argument('7');
156: }
157:
158: void
159: Digit8()
160: {
161: gather_numeric_argument('8');
162: }
163:
164: void
165: Digit9()
166: {
167: gather_numeric_argument('9');
168: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.