[BACK]Return to mathcap.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / ox_toolkit

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>