Annotation of OpenXM/src/ox_toolkit/mathcap.c, Revision 1.2
1.1 ohara 1: /* -*- mode: C; coding: euc-japan -*- */
1.2 ! ohara 2: /* $OpenXM: OpenXM/src/ox_toolkit/mathcap.c,v 1.1 2000/10/10 05:23:20 ohara Exp $ */
1.1 ohara 3:
4: /* This module includes functions for handling mathcap databases. */
5:
6: #include <stdlib.h>
7: #include "ox_toolkit.h"
8:
9: typedef struct {
10: int tag;
11: int flag;
1.2 ! ohara 12: } mcdb;
1.1 ohara 13:
1.2 ! ohara 14: static mcdb *mcdb_lookup(mcdb *db, int tag);
! 15: static void mcdb_ctl(mcdb *db, int tag, int flag);
! 16: static void mcdb_ctl_all(mcdb *db, int flag);
! 17: static cmo_list *mcdb_get_allow_all(mcdb *db);
! 18:
! 19: static char *new_string(char *s);
! 20: static cmo_list *cmo_mathcap_get_cmotypes(cmo_mathcap *mc);
! 21: static cmo_list *get_messagetypes(cmo_list *ob, int type);
! 22: static cmo_list *mathcap_sm_get_all();
! 23: static cmo_list *mathcap_sysinfo_get_all();
1.1 ohara 24: static int mathcap_cmo_isallow_cmo_list(cmo_list *ob);
1.2 ! ohara 25: static int mathcap_cmo_isallow_cmo_mathcap(cmo_mathcap *ob);
1.1 ohara 26: static int mathcap_cmo_isallow_cmo_monomial32(cmo_monomial32 *ob);
1.2 ! ohara 27: static int mathcap_cmo_isallow_tag(int tag);
! 28: static void mathcap_cmo_allow(int tag);
! 29: static void mathcap_cmo_allow_all();
! 30: static void mathcap_cmo_deny(int tag);
! 31: static void mathcap_cmo_deny_all();
1.1 ohara 32: static void mathcap_cmo_update(cmo_list* types);
33:
1.2 ! ohara 34: static mcdb mathcap_cmo[] = {
1.1 ohara 35: {CMO_NULL, MATHCAP_FLAG_ALLOW},
36: {CMO_INT32, MATHCAP_FLAG_ALLOW},
37: {CMO_DATUM, MATHCAP_FLAG_ALLOW},
38: {CMO_STRING, MATHCAP_FLAG_ALLOW},
39: {CMO_MATHCAP, MATHCAP_FLAG_ALLOW},
40: {CMO_LIST, MATHCAP_FLAG_ALLOW},
41: {CMO_MONOMIAL32, MATHCAP_FLAG_ALLOW},
42: {CMO_ZZ, MATHCAP_FLAG_ALLOW},
43: {CMO_ZERO, MATHCAP_FLAG_ALLOW},
44: {CMO_DMS_GENERIC, MATHCAP_FLAG_ALLOW},
45: {CMO_RING_BY_NAME, MATHCAP_FLAG_ALLOW},
46: {CMO_INDETERMINATE, MATHCAP_FLAG_ALLOW},
47: {CMO_DISTRIBUTED_POLYNOMIAL, MATHCAP_FLAG_ALLOW},
48: {CMO_ERROR2, MATHCAP_FLAG_ALLOW},
49: {0, MATHCAP_FLAG_DENY}
50: };
51:
1.2 ! ohara 52: static mcdb mathcap_sm[] = {
! 53: {SM_popCMO, MATHCAP_FLAG_ALLOW},
! 54: {SM_popString, MATHCAP_FLAG_ALLOW},
! 55: {SM_mathcap, MATHCAP_FLAG_ALLOW},
! 56: {SM_pops, MATHCAP_FLAG_ALLOW},
! 57: {SM_executeStringByLocalParser, MATHCAP_FLAG_ALLOW},
! 58: {SM_executeFunction, MATHCAP_FLAG_ALLOW},
! 59: {SM_setMathCap, MATHCAP_FLAG_ALLOW},
! 60: {SM_shutdown, MATHCAP_FLAG_ALLOW},
! 61: {SM_control_kill, MATHCAP_FLAG_ALLOW},
! 62: {SM_control_reset_connection, MATHCAP_FLAG_ALLOW},
! 63: {0, MATHCAP_FLAG_DENY}
1.1 ohara 64: };
65:
1.2 ! ohara 66: typedef struct {
! 67: mcdb *cmo_db;
! 68: mcdb *sm_db;
! 69: } mathcap;
! 70:
! 71: mathcap default_mathcap = {mathcap_cmo, mathcap_sm};
! 72:
! 73: mcdb *new_mcdb(mcdb *src)
! 74: {
! 75: mcdb *new;
! 76: int len=0;
! 77: while ((src+(len++))->tag != 0) {
! 78: }
! 79: new = malloc(sizeof(mcdb)*len);
! 80: memcpy(new, src, sizeof(mcdb)*len);
! 81: return new;
! 82: }
! 83:
! 84: mathcap *new_mathcap()
! 85: {
! 86: mathcap *new = malloc(sizeof(mathcap));
! 87: new->cmo_db = new_mcdb(mathcap_cmo);
! 88: new->sm_db = new_mcdb(mathcap_sm);
! 89: return new;
! 90: }
! 91:
! 92: /* 次の tag についてのキーを探す */
! 93: static mcdb *mcdb_lookup(mcdb *db, int tag)
! 94: {
! 95: while (db->tag != 0) {
! 96: if (db->tag == tag) {
! 97: return db;
! 98: }
! 99: db++;
! 100: }
! 101: return NULL;
! 102: }
! 103:
! 104: /* tag に対する送信制御 */
! 105: static void mcdb_ctl(mcdb *db, int tag, int flag)
! 106: {
! 107: mcdb *e = mcdb_lookup(db, tag);
! 108: if (e != NULL) {
! 109: e->flag = flag;
! 110: }
! 111: }
! 112:
! 113: /* 全データに対する送信制御 */
! 114: static void mcdb_ctl_all(mcdb *db, int flag)
! 115: {
! 116: while (db->tag != 0) {
! 117: db->flag = flag;
! 118: db++;
! 119: }
! 120: }
! 121:
! 122: /* 送信許可されている tag のリストを得る */
! 123: static cmo_list *mcdb_get_allow_all(mcdb *db)
! 124: {
! 125: cmo_list *list = new_cmo_list();
! 126: while (db->tag != 0) {
! 127: if (db->flag == MATHCAP_FLAG_ALLOW) {
! 128: list_append(list, (cmo *)new_cmo_int32(db->tag));
! 129: }
! 130: db++;
! 131: }
! 132: return list;
! 133: }
! 134:
1.1 ohara 135: static struct {
136: int version;
137: char *version_string;
138: char *sysname;
139: char *hosttype;
140: } mathcap_sysinfo = {0, "NO VERSION", "NONAME", "UNKNOWN"};
141:
142: /* 次の tag をもつ cmo の送信が許可されているかを調べる */
143: static int mathcap_cmo_isallow_tag(int tag)
144: {
1.2 ! ohara 145: mcdb *e = mathcap_cmo;
1.1 ohara 146: while (e->tag != 0 && e->tag != tag) {
147: e++;
148: }
149: return e->flag;
150: }
151:
152: static int mathcap_cmo_isallow_cmo_list(cmo_list *ob)
153: {
154: cell *el;
155: if (mathcap_cmo_isallow_tag(ob->tag)) {
156: el = list_first(ob);
157: while (!list_endof(ob, el)) {
158: if (!mathcap_cmo_isallow_cmo(el->cmo)) {
159: return MATHCAP_FLAG_DENY;
160: }
161: el = list_next(el);
162: }
163: return MATHCAP_FLAG_ALLOW;
164: }
165: return MATHCAP_FLAG_DENY;
166: }
167:
1.2 ! ohara 168: __inline__
1.1 ohara 169: static int mathcap_cmo_isallow_cmo_monomial32(cmo_monomial32 *ob)
170: {
171: return mathcap_cmo_isallow_tag(ob->tag)
172: && mathcap_cmo_isallow_cmo(ob->coef);
173: }
174:
1.2 ! ohara 175: __inline__
1.1 ohara 176: static int mathcap_cmo_isallow_cmo_mathcap(cmo_mathcap *ob)
177: {
178: return mathcap_cmo_isallow_tag(ob->tag)
179: && mathcap_cmo_isallow_cmo(ob->ob);
180: }
181:
182: /* 次の cmo の送信が許可されているかを調べる */
183: int mathcap_cmo_isallow_cmo(cmo *ob)
184: {
185: int tag = ob->tag;
186: switch(tag) {
187: case CMO_LIST:
188: case CMO_DISTRIBUTED_POLYNOMIAL:
189: return mathcap_cmo_isallow_cmo_list((cmo_list *)ob);
190: case CMO_MATHCAP:
191: case CMO_ERROR2:
192: case CMO_RING_BY_NAME:
193: case CMO_INDETERMINATE:
194: return mathcap_cmo_isallow_cmo_mathcap((cmo_mathcap *)ob);
195: case CMO_MONOMIAL32:
196: return mathcap_cmo_isallow_cmo_monomial32((cmo_monomial32 *)ob);
197: default:
198: return mathcap_cmo_isallow_tag(tag);
199: }
200: }
201:
202: /* 次の tag をもつ cmo の送信を許可する */
1.2 ! ohara 203: __inline__
! 204: static void mathcap_cmo_allow(int tag)
1.1 ohara 205: {
1.2 ! ohara 206: mcdb_ctl(mathcap_cmo, tag, MATHCAP_FLAG_ALLOW);
1.1 ohara 207: }
208:
209: /* 次の tag をもつ cmo の送信を不許可にする */
1.2 ! ohara 210: __inline__
! 211: static void mathcap_cmo_deny(int tag)
1.1 ohara 212: {
1.2 ! ohara 213: mcdb_ctl(mathcap_cmo, tag, MATHCAP_FLAG_DENY);
1.1 ohara 214: }
215:
216: /* 全ての種類の cmo の送信を不許可にする */
1.2 ! ohara 217: __inline__
! 218: static void mathcap_cmo_deny_all()
1.1 ohara 219: {
1.2 ! ohara 220: mcdb_ctl_all(mathcap_cmo, MATHCAP_FLAG_DENY);
1.1 ohara 221: }
222:
223: /* 全ての種類の cmo の送信を許可する */
1.2 ! ohara 224: __inline__
! 225: static void mathcap_cmo_allow_all()
1.1 ohara 226: {
1.2 ! ohara 227: mcdb_ctl_all(mathcap_cmo, MATHCAP_FLAG_ALLOW);
1.1 ohara 228: }
229:
230: /* 送信許可されている cmo のリストを得る */
231: cmo_list *mathcap_cmo_get_allow_all()
232: {
1.2 ! ohara 233: return mcdb_get_allow_all(mathcap_cmo);
1.1 ohara 234: }
235:
236: /* 既知の sm コマンドのリストを得る */
1.2 ! ohara 237: __inline__
! 238: static cmo_list *mathcap_sm_get_all()
1.1 ohara 239: {
1.2 ! ohara 240: return mcdb_get_allow_all(mathcap_sm);
1.1 ohara 241: }
242:
243: /* システム情報を得る */
1.2 ! ohara 244: static cmo_list *mathcap_sysinfo_get_all()
1.1 ohara 245: {
246: cmo_list *syslist = new_cmo_list();
247: cmo_int32 *ver = new_cmo_int32(mathcap_sysinfo.version);
248: cmo_string *vers = new_cmo_string(mathcap_sysinfo.version_string);
249: cmo_string *host = new_cmo_string(mathcap_sysinfo.hosttype);
250: cmo_string *sname = new_cmo_string(mathcap_sysinfo.sysname);
251: return list_appendl(syslist, ver, sname, vers, host);
252: }
253:
254: static char *new_string(char *s)
255: {
256: char *t = malloc(sizeof(s)+1);
257: strcpy(t, s);
258: return t;
259: }
260:
261: void mathcap_sysinfo_set(int version, char *version_string, char *sysname)
262: {
263: char *host = getenv("HOSTTYPE");
264:
265: mathcap_sysinfo.hosttype = (host != NULL)? new_string(host): "UNKNOWN";
266: mathcap_sysinfo.sysname = new_string(sysname);
267: mathcap_sysinfo.version_string = new_string(version_string);
268: mathcap_sysinfo.version = version;
269: }
270:
271: /* データベースから cmo_mathcap を生成する */
272: cmo_mathcap* mathcap_get()
273: {
274: cmo_list *mc = new_cmo_list();
275: cmo_list *l3 = new_cmo_list();
276: list_append(l3, list_appendl(new_cmo_list(), new_cmo_int32(OX_DATA), mathcap_cmo_get_allow_all(), NULL));
277: list_appendl(mc, (cmo *)mathcap_sysinfo_get_all(), (cmo *)mathcap_sm_get_all(), (cmo *)l3, NULL);
278: return new_cmo_mathcap((cmo *)mc);
279: }
280:
281: static void mathcap_cmo_update(cmo_list* types)
282: {
283: cell *el = list_first(types);
284: cmo_int32 *ob;
285: while(!list_endof(types, el)) {
286: ob = (cmo_int32 *)el->cmo;
287: if (ob->tag == CMO_INT32) {
288: mathcap_cmo_allow(ob->i);
289: }
290: el = list_next(el);
291: }
292: }
293:
294: /* cmo_mathcap が妥当な構造を持つかを調べる. (未実装) */
295: int cmo_mathcap_isvalid(cmo_mathcap *mc)
296: {
297: return 1;
298: }
299:
300: /* ( ..., ( type, (...) ), (cmo_int32, (...) ), ... ) */
301: /* ^^^^^ Here! */
302: static cmo_list *get_messagetypes(cmo_list *ob, int type)
303: {
304: cmo_list *c;
305: cell *el;
306:
307: for (el = list_first(ob); !list_endof(ob, el); el = list_next(el)) {
308: c = (cmo_list *)el->cmo;
309: if (((cmo_int32 *)list_nth(c, 0))->i == type) {
310: return (cmo_list *)list_nth(c, 1);
311: }
312: }
313: return NULL;
314: }
315:
316: /* cmo_mathcap->ob = ( (...), (...), ( ( cmo_int32, (...) ), ...), ...) */
317: /* ^^^^^ Here! */
1.2 ! ohara 318: __inline__
1.1 ohara 319: static cmo_list *cmo_mathcap_get_cmotypes(cmo_mathcap *mc)
320: {
321: cmo_list *ob = (cmo_list *)list_nth((cmo_list *)mc->ob, 2);
322: return get_messagetypes(ob, OX_DATA);
323: }
324:
325: /* 受信した mathcap データを反映させる */
326: void mathcap_update(cmo_mathcap *mc)
327: {
328: cmo_list *types;
329: if (cmo_mathcap_isvalid(mc)) {
330: types = cmo_mathcap_get_cmotypes(mc);
331: if (types != NULL) {
332: mathcap_cmo_deny_all(); /* すべての cmo の送信を禁止 */
333: mathcap_cmo_update(types);
334: }
335: }
336: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>