Annotation of OpenXM/src/kan96xx/Kan/option.c, Revision 1.1.1.1
1.1 maekawa 1: #include <stdio.h>
2: #include "datatype.h"
3: #include "stackm.h"
4: #include "extern.h"
5: #include "gradedset.h"
6: #include "kclass.h"
7: #include "lookup.h"
8: #include <signal.h>
9:
10: extern void ctrlC();
11:
12:
13: struct object KsystemVariable(ob)
14: struct object ob; /* Sarray */
15: {
16: /* Don't forget to write the keys in usage.c */
17: extern int PrintDollar;
18: extern int Wrap;
19: extern struct ring *CurrentRingp;
20: extern int Verbose;
21: extern int UseCriterion1;
22: extern int UseCriterion2B;
23: extern int ReduceLowerTerms;
24: extern int CheckHomogenization;
25: extern int Homogenize;
26: extern int Statistics;
27: extern int Osp;
28: extern struct operandStack StandardStack;
29: extern struct operandStack ErrorStack;
30: extern int ErrorMessageMode;
31: extern int WarningMessageMode;
32: extern int CatchCtrlC;
33: extern int Strict;
34: extern struct context *CurrentContextp;
35: extern struct context *PrimitiveContextp;
36: extern int Strict2;
37: extern int SigIgn;
38: extern int KSPushEnvMode;
39: extern int KanGBmessage;
40: extern int TimerOn;
41: extern int OutputStyle;
42: extern int Sugar;
43: extern int Homogenize_vec;
44: extern int CmoDMSOutputOption;
45: extern int DebugReductionRed; /* hidden option */
46: extern char *VersionString;
47: extern int AvoidTheSameRing;
48:
49: int n,i;
50: struct object ob1,ob2,ob3,ob4;
51: struct object rob = NullObject;
52: switch (getoaSize(ob)) {
53: case 1: /* get the value */
54: ob1 = getoa(ob,0);
55: switch(ob1.tag) {
56: case Sdollar:
57: if (strcmp(ob1.lc.str,"PrintDollar") == 0) {
58: rob = KpoInteger(PrintDollar);
59: }else if (strcmp(ob1.lc.str,"Wrap") == 0) {
60: rob = KpoInteger(Wrap);
61: }else if (strcmp(ob1.lc.str,"P") == 0) {
62: rob = KpoInteger(CurrentRingp->p);
63: }else if (strcmp(ob1.lc.str,"N") == 0) {
64: rob = KpoInteger(CurrentRingp->n);
65: }else if (strcmp(ob1.lc.str,"NN") == 0) {
66: rob = KpoInteger(CurrentRingp->nn);
67: }else if (strcmp(ob1.lc.str,"M") == 0) {
68: rob = KpoInteger(CurrentRingp->m);
69: }else if (strcmp(ob1.lc.str,"MM") == 0) {
70: rob = KpoInteger(CurrentRingp->mm);
71: }else if (strcmp(ob1.lc.str,"L") == 0) {
72: rob = KpoInteger(CurrentRingp->l);
73: }else if (strcmp(ob1.lc.str,"LL") == 0) {
74: rob = KpoInteger(CurrentRingp->ll);
75: }else if (strcmp(ob1.lc.str,"C") == 0) {
76: rob = KpoInteger(CurrentRingp->c);
77: }else if (strcmp(ob1.lc.str,"CC") == 0) {
78: rob = KpoInteger(CurrentRingp->cc);
79: }else if (strcmp(ob1.lc.str,"CurrentRingp") == 0) {
80: rob = KpoRingp(CurrentRingp);
81: }else if (strcmp(ob1.lc.str,"Verbose") == 0) {
82: rob = KpoInteger(Verbose);
83: }else if (strcmp(ob1.lc.str,"UseCriterion1") == 0) {
84: rob = KpoInteger(UseCriterion1);
85: }else if (strcmp(ob1.lc.str,"UseCriterion2B") == 0) {
86: rob = KpoInteger(UseCriterion2B);
87: }else if (strcmp(ob1.lc.str,"ReduceLowerTerms") == 0) {
88: rob = KpoInteger(ReduceLowerTerms);
89: }else if (strcmp(ob1.lc.str,"CheckHomogenization") == 0) {
90: rob = KpoInteger(CheckHomogenization);
91: }else if (strcmp(ob1.lc.str,"Homogenize") == 0) {
92: rob = KpoInteger(Homogenize);
93: }else if (strcmp(ob1.lc.str,"Statistics") == 0) {
94: rob = KpoInteger(Statistics);
95: }else if (strcmp(ob1.lc.str,"StackPointer") == 0) {
96: rob = KpoInteger(Osp);
97: }else if (strcmp(ob1.lc.str,"StandardOperandStack") == 0) {
98: rob.tag = Sclass;
99: rob.lc.ival = CLASSNAME_OPERANDSTACK;
100: rob.rc.voidp = &StandardStack;
101: }else if (strcmp(ob1.lc.str,"ErrorStack") == 0) {
102: rob.tag = Sclass;
103: rob.lc.ival = CLASSNAME_OPERANDSTACK;
104: rob.rc.voidp = &ErrorStack;
105: }else if (strcmp(ob1.lc.str,"ErrorMessageMode") == 0) {
106: rob = KpoInteger(ErrorMessageMode);
107: }else if (strcmp(ob1.lc.str,"WarningMessageMode") == 0) {
108: rob = KpoInteger(WarningMessageMode);
109: }else if (strcmp(ob1.lc.str,"CatchCtrlC") == 0) {
110: rob = KpoInteger(CatchCtrlC);
111: /* If you catch ctrlc in KSexecuteString. */
112: }else if (strcmp(ob1.lc.str,"Strict") == 0) {
113: rob = KpoInteger(Strict);
114: }else if (strcmp(ob1.lc.str,"CurrentContextp") == 0) {
115: rob.tag = Sclass;
116: rob.lc.ival = CLASSNAME_CONTEXT;
117: rob.rc.voidp = CurrentContextp;
118: }else if (strcmp(ob1.lc.str,"PrimitiveContextp") == 0) {
119: rob.tag = Sclass;
120: rob.lc.ival = CLASSNAME_CONTEXT;
121: rob.rc.voidp = PrimitiveContextp;
122: }else if (strcmp(ob1.lc.str,"NullContextp") == 0) {
123: rob.tag = Sclass;
124: rob.lc.ival = CLASSNAME_CONTEXT;
125: rob.rc.voidp = (struct context *)NULL;
126: }else if (strcmp(ob1.lc.str,"Strict2") == 0) {
127: rob = KpoInteger(Strict2);
128: }else if (strcmp(ob1.lc.str,"SigIgn") == 0) {
129: rob = KpoInteger(SigIgn);
130: }else if (strcmp(ob1.lc.str,"KSPushEnvMode") == 0) {
131: rob = KpoInteger(KSPushEnvMode);
132: }else if (strcmp(ob1.lc.str,"KanGBmessage") == 0) {
133: rob = KpoInteger(KanGBmessage);
134: }else if (strcmp(ob1.lc.str,"TimerOn") == 0) {
135: rob = KpoInteger(TimerOn);
136: }else if (strcmp(ob1.lc.str,"orderMatrix") == 0) {
137: rob = KgetOrderMatrixOfCurrentRing();
138: }else if (strcmp(ob1.lc.str,"gbListTower") == 0) {
139: if (CurrentRingp->gbListTower == NULL) rob = NullObject;
140: else rob = *((struct object *)(CurrentRingp->gbListTower));
141: }else if (strcmp(ob1.lc.str,"outputOrder") == 0) {
142: n = CurrentRingp->n;
143: ob1 = newObjectArray(n*2);
144: for (i=0; i<2*n; i++) {
145: putoa(ob1,i,KpoInteger(CurrentRingp->outputOrder[i]));
146: }
147: rob = ob1;
148: }else if (strcmp(ob1.lc.str,"multSymbol") == 0) {
149: rob = KpoInteger(OutputStyle);
150: }else if (strcmp(ob1.lc.str,"Sugar") == 0) {
151: rob = KpoInteger(Sugar);
152: }else if (strcmp(ob1.lc.str,"Homogenize_vec") == 0) {
153: rob = KpoInteger(Homogenize_vec);
154: }else if (strcmp(ob1.lc.str,"Schreyer")==0) {
155: rob = KpoInteger( CurrentRingp->schreyer );
156: }else if (strcmp(ob1.lc.str,"ringName")==0) {
157: rob = KpoString( CurrentRingp->name );
158: }else if (strcmp(ob1.lc.str,"CmoDMSOutputOption")==0) {
159: rob = KpoInteger( CmoDMSOutputOption );
160: }else if (strcmp(ob1.lc.str,"Version")==0) {
161: rob = KpoString(VersionString);
162: }else if (strcmp(ob1.lc.str,"RingStack")==0) {
163: KsetUpRing(NullObject,NullObject,NullObject,NullObject,NullObject);
164: rob = KSpop(); /* This is exceptional style */
165: }else if (strcmp(ob1.lc.str,"AvoidTheSameRing")==0) {
166: rob = KpoInteger(AvoidTheSameRing);
167: }else{
168: warningKan("KsystemVariable():Unknown key word.\n");
169: }
170: break;
171: default:
172: warningKan("KsystemVariable():Invalid argument\n");
173: break;
174: }
175: break;
176: case 2: /* set value */
177: ob1 = getoa(ob,0);
178: ob2 = getoa(ob,1);
179: switch (Lookup[ob1.tag][ob2.tag]) {
180: case SdollarSinteger:
181: if (strcmp(ob1.lc.str,"PrintDollar") == 0) {
182: PrintDollar = ob2.lc.ival;
183: rob = KpoInteger(PrintDollar);
184: }else if (strcmp(ob1.lc.str,"Wrap") == 0) {
185: Wrap = ob2.lc.ival;
186: rob = KpoInteger(Wrap);
187: /*}else if (strcmp(ob1.lc.str,"P") == 0) {
188: P = ob2.lc.ival; Q should be set here too.
189: CurrentRingp->p = P;
190: rob = KpoInteger(P); */
191: }else if (strcmp(ob1.lc.str,"NN") == 0) {
192: if (ob2.lc.ival <= CurrentRingp->n && ob2.lc.ival >= CurrentRingp->m) {
193: CurrentRingp->nn = ob2.lc.ival;
194: }else{
195: warningKan("New value of NN is out of bound.");
196: }
197: rob = KpoInteger(ob1.lc.ival);
198: }else if (strcmp(ob1.lc.str,"Verbose") == 0) {
199: Verbose = ob2.lc.ival;
200: rob = KpoInteger(Verbose);
201: }else if (strcmp(ob1.lc.str,"UseCriterion1") == 0) {
202: UseCriterion1 = ob2.lc.ival;
203: rob = KpoInteger(UseCriterion1);
204: }else if (strcmp(ob1.lc.str,"UseCriterion2B") == 0) {
205: UseCriterion2B = ob2.lc.ival;
206: rob = KpoInteger(UseCriterion2B);
207: }else if (strcmp(ob1.lc.str,"ReduceLowerTerms") == 0) {
208: ReduceLowerTerms = ob2.lc.ival;
209: rob = KpoInteger(ReduceLowerTerms);
210: }else if (strcmp(ob1.lc.str,"CheckHomogenization") == 0) {
211: CheckHomogenization = ob2.lc.ival;
212: rob = KpoInteger(CheckHomogenization);
213: }else if (strcmp(ob1.lc.str,"Homogenize") == 0) {
214: Homogenize = ob2.lc.ival;
215: rob = KpoInteger(Homogenize);
216: }else if (strcmp(ob1.lc.str,"Statistics") == 0) {
217: Statistics = ob2.lc.ival;
218: rob = KpoInteger(Statistics);
219: }else if (strcmp(ob1.lc.str,"ErrorMessageMode") == 0) {
220: ErrorMessageMode = ob2.lc.ival;
221: rob = KpoInteger(ErrorMessageMode);
222: }else if (strcmp(ob1.lc.str,"WarningMessageMode") == 0) {
223: WarningMessageMode = ob2.lc.ival;
224: rob = KpoInteger(WarningMessageMode);
225: }else if (strcmp(ob1.lc.str,"CatchCtrlC") == 0) {
226: CatchCtrlC = ob2.lc.ival;
227: rob = KpoInteger(CatchCtrlC);
228: }else if (strcmp(ob1.lc.str,"Strict") == 0) {
229: Strict = ob2.lc.ival;
230: rob = KpoInteger(Strict);
231: }else if (strcmp(ob1.lc.str,"Strict2") == 0) {
232: Strict2 = ob2.lc.ival;
233: rob = KpoInteger(Strict2);
234: }else if (strcmp(ob1.lc.str,"SigIgn") == 0) {
235: SigIgn = ob2.lc.ival;
236: if (SigIgn) signal(SIGINT,SIG_IGN);
237: else signal(SIGINT,ctrlC);
238: rob = KpoInteger(SigIgn);
239: }else if (strcmp(ob1.lc.str,"KSPushEnvMode") == 0) {
240: KSPushEnvMode = ob2.lc.ival;
241: rob = KpoInteger(KSPushEnvMode);
242: }else if (strcmp(ob1.lc.str,"KanGBmessage") == 0) {
243: KanGBmessage = ob2.lc.ival;
244: rob = KpoInteger(KanGBmessage);
245: }else if (strcmp(ob1.lc.str,"TimerOn") == 0) {
246: TimerOn = ob2.lc.ival;
247: rob = KpoInteger(TimerOn);
248: }else if (strcmp(ob1.lc.str,"multSymbol") == 0) {
249: OutputStyle = KopInteger(ob2);
250: rob = KpoInteger(OutputStyle);
251: }else if (strcmp(ob1.lc.str,"Sugar") == 0) {
252: Sugar = KopInteger(ob2);
253: if (Sugar && ReduceLowerTerms) {
254: ReduceLowerTerms = 0;
255: warningKan("ReduceLowerTerms is automatically set to 0, because Sugar = 1.");
256: /* You cannot use both ReduceLowerTerms and sugar.
257: See gb.c, reduction_sugar. */
258: }
259: rob = KpoInteger(Sugar);
260: }else if (strcmp(ob1.lc.str,"Homogenize_vec") == 0) {
261: Homogenize_vec = KopInteger(ob2);
262: rob = KpoInteger(Homogenize_vec);
263: }else if (strcmp(ob1.lc.str,"CmoDMSOutputOption") == 0) {
264: CmoDMSOutputOption = KopInteger(ob2);
265: rob = KpoInteger(CmoDMSOutputOption);
266: }else if (strcmp(ob1.lc.str,"DebugReductionRed") == 0) {
267: DebugReductionRed = KopInteger(ob2);
268: rob = KpoInteger(DebugReductionRed);
269: }else if (strcmp(ob1.lc.str,"AvoidTheSameRing") == 0) {
270: AvoidTheSameRing = KopInteger(ob2);
271: rob = KpoInteger(AvoidTheSameRing);
272: }else{
273: warningKan("KsystemVariable():Unknown key word.\n");
274: }
275: break;
276: case SdollarSdollar:
277: if (strcmp(ob1.lc.str,"ringName") == 0) {
278: CurrentRingp->name = KopString(ob2);
279: rob = KpoString(CurrentRingp->name);
280: }else{
281: warningKan("KsystemVariable():Unknown key word.\n");
282: }
283: break;
284: case SdollarSring:
285: if (strcmp(ob1.lc.str,"CurrentRingp") == 0) {
286: CurrentRingp = ob2.lc.ringp;
287: rob = KpoRingp(CurrentRingp);
288: }else{
289: warningKan("KsystemVariable():Unknown key word.\n");
290: }
291: break;
292: case SdollarSclass:
293: if (strcmp(ob1.lc.str,"PrimitiveContextp") == 0) {
294: if (ectag(ob2) == CLASSNAME_CONTEXT) {
295: PrimitiveContextp = (struct context *)ob2.rc.voidp;
296: rob = ob2;
297: }else{
298: warningKan("The second argument must be class.context.\n");
299: rob = NullObject;
300: }
301: }else {
302: warningKan("KsystemVariable():Unknown key word.\n");
303: }
304: break;
305: case SdollarSlist:
306: if (strcmp(ob1.lc.str,"gbListTower") == 0) {
307: if (AvoidTheSameRing)
308: warningKan("Changing gbListTower may cause a trouble under AvoidTheSameRing == 1.");
309: CurrentRingp->gbListTower = newObject();
310: *((struct object *)(CurrentRingp->gbListTower)) = ob2;
311: rob = *((struct object *)(CurrentRingp->gbListTower));
312: }else {
313: warningKan("KsystemVariable(): Unknown key word to set value.\n");
314: }
315: break;
316: case SdollarSarray:
317: if (strcmp(ob1.lc.str,"outputOrder") == 0) {
318: rob = KsetOutputOrder(ob2,CurrentRingp);
319: }else if (strcmp(ob1.lc.str,"variableNames") == 0) {
320: rob = KsetVariableNames(ob2,CurrentRingp);
321: }else {
322: warningKan("KsystemVariable(): Unknown key word to set value.\n");
323: }
324: break;
325: default:
326: warningKan("KsystemVariable():Invalid argument.\n");
327: }
328: break;
329: case 3:
330: ob1 = getoa(ob,0); ob2 = getoa(ob,1); ob3 = getoa(ob,2);
331: switch(Lookup[ob1.tag][ob2.tag]) {
332: case SdollarSdollar:
333: if (strcmp(ob2.lc.str,"var") == 0) {
334: if (strcmp(ob1.lc.str,"x")==0) {
335: if (ob3.tag != Sinteger) {
336: warningKan("[$x$ $var$ ? ] The 3rd argument must be integer.");
337: break;
338: }
339: if (ob3.lc.ival >= 0 && ob3.lc.ival < CurrentRingp->n) {
340: rob = KpoString(CurrentRingp->x[ob3.lc.ival]);
341: }else{
342: warningKan("[$x$ $var$ ? ] The 3rd argument is out of range.");
343: break;
344: }
345: }else if (strcmp(ob1.lc.str,"D")==0) {
346: if (ob3.tag != Sinteger) {
347: warningKan("[$D$ $var$ ? ] The 3rd argument must be integer.");
348: break;
349: }
350: if (ob3.lc.ival >= 0 && ob3.lc.ival < CurrentRingp->n) {
351: rob = KpoString(CurrentRingp->D[ob3.lc.ival]);
352: }else{
353: warningKan("[$D$ $var$ ? ] The 3rd argument is out of range.");
354: break;
355: }
356: }
357: }else{
358: warningKan("KsystemVariable(): Invalid argument.\n");
359: }
360: break;
361: default:
362: warningKan("KsystemVariable(): Invalid argument.\n");
363: break;
364: }
365: break;
366: default:
367: warningKan("KsystemVariable():Invalid argument.\n");
368: break;
369: }
370: return(rob);
371: }
372:
373: warningOption(str)
374: char *str;
375: {
376: fprintf(stderr,"Warning(option.c): %s\n",str);
377: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>