version 1.1, 2000/10/10 05:23:20 |
version 1.2, 2000/10/12 15:40:41 |
|
|
/* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C; coding: euc-japan -*- */ |
/* $OpenXM$ */ |
/* $OpenXM: OpenXM/src/ox_toolkit/mathcap.c,v 1.1 2000/10/10 05:23:20 ohara Exp $ */ |
|
|
/* This module includes functions for handling mathcap databases. */ |
/* This module includes functions for handling mathcap databases. */ |
|
|
|
|
typedef struct { |
typedef struct { |
int tag; |
int tag; |
int flag; |
int flag; |
} mc_cell; |
} mcdb; |
|
|
static int mathcap_cmo_isallow_tag(int tag); |
static mcdb *mcdb_lookup(mcdb *db, int tag); |
static mc_cell *mathcap_cmo_lookup(int tag); |
static void mcdb_ctl(mcdb *db, int tag, int flag); |
static int mathcap_cmo_isallow_cmo_list(cmo_list *ob); |
static void mcdb_ctl_all(mcdb *db, int flag); |
static int mathcap_cmo_isallow_cmo_monomial32(cmo_monomial32 *ob); |
static cmo_list *mcdb_get_allow_all(mcdb *db); |
static int mathcap_cmo_isallow_cmo_mathcap(cmo_mathcap *ob); |
|
static char *new_string(char *s); |
static char *new_string(char *s); |
static void mathcap_cmo_update(cmo_list* types); |
|
static cmo_list *get_messagetypes(cmo_list *ob, int type); |
|
static cmo_list *cmo_mathcap_get_cmotypes(cmo_mathcap *mc); |
static cmo_list *cmo_mathcap_get_cmotypes(cmo_mathcap *mc); |
static cmo_list *get_messagetypes(cmo_list *ob, int type); |
static cmo_list *get_messagetypes(cmo_list *ob, int type); |
static cmo_list *cmo_mathcap_get_cmotypes(cmo_mathcap *mc); |
static cmo_list *mathcap_sm_get_all(); |
|
static cmo_list *mathcap_sysinfo_get_all(); |
|
static int mathcap_cmo_isallow_cmo_list(cmo_list *ob); |
|
static int mathcap_cmo_isallow_cmo_mathcap(cmo_mathcap *ob); |
|
static int mathcap_cmo_isallow_cmo_monomial32(cmo_monomial32 *ob); |
|
static int mathcap_cmo_isallow_tag(int tag); |
|
static void mathcap_cmo_allow(int tag); |
|
static void mathcap_cmo_allow_all(); |
|
static void mathcap_cmo_deny(int tag); |
|
static void mathcap_cmo_deny_all(); |
|
static void mathcap_cmo_update(cmo_list* types); |
|
|
static mc_cell mathcap_cmo[] = { |
static mcdb mathcap_cmo[] = { |
{CMO_NULL, MATHCAP_FLAG_ALLOW}, |
{CMO_NULL, MATHCAP_FLAG_ALLOW}, |
{CMO_INT32, MATHCAP_FLAG_ALLOW}, |
{CMO_INT32, MATHCAP_FLAG_ALLOW}, |
{CMO_DATUM, MATHCAP_FLAG_ALLOW}, |
{CMO_DATUM, MATHCAP_FLAG_ALLOW}, |
Line 41 static mc_cell mathcap_cmo[] = { |
|
Line 49 static mc_cell mathcap_cmo[] = { |
|
{0, MATHCAP_FLAG_DENY} |
{0, MATHCAP_FLAG_DENY} |
}; |
}; |
|
|
static int mathcap_sm[] = { |
static mcdb mathcap_sm[] = { |
SM_popCMO, |
{SM_popCMO, MATHCAP_FLAG_ALLOW}, |
SM_popString, |
{SM_popString, MATHCAP_FLAG_ALLOW}, |
SM_mathcap, |
{SM_mathcap, MATHCAP_FLAG_ALLOW}, |
SM_pops, |
{SM_pops, MATHCAP_FLAG_ALLOW}, |
SM_executeStringByLocalParser, |
{SM_executeStringByLocalParser, MATHCAP_FLAG_ALLOW}, |
SM_executeFunction, |
{SM_executeFunction, MATHCAP_FLAG_ALLOW}, |
SM_setMathCap, |
{SM_setMathCap, MATHCAP_FLAG_ALLOW}, |
SM_shutdown, |
{SM_shutdown, MATHCAP_FLAG_ALLOW}, |
SM_control_kill, |
{SM_control_kill, MATHCAP_FLAG_ALLOW}, |
SM_control_reset_connection, |
{SM_control_reset_connection, MATHCAP_FLAG_ALLOW}, |
0 |
{0, MATHCAP_FLAG_DENY} |
}; |
}; |
|
|
|
typedef struct { |
|
mcdb *cmo_db; |
|
mcdb *sm_db; |
|
} mathcap; |
|
|
|
mathcap default_mathcap = {mathcap_cmo, mathcap_sm}; |
|
|
|
mcdb *new_mcdb(mcdb *src) |
|
{ |
|
mcdb *new; |
|
int len=0; |
|
while ((src+(len++))->tag != 0) { |
|
} |
|
new = malloc(sizeof(mcdb)*len); |
|
memcpy(new, src, sizeof(mcdb)*len); |
|
return new; |
|
} |
|
|
|
mathcap *new_mathcap() |
|
{ |
|
mathcap *new = malloc(sizeof(mathcap)); |
|
new->cmo_db = new_mcdb(mathcap_cmo); |
|
new->sm_db = new_mcdb(mathcap_sm); |
|
return new; |
|
} |
|
|
|
/* 次の tag についてのキーを探す */ |
|
static mcdb *mcdb_lookup(mcdb *db, int tag) |
|
{ |
|
while (db->tag != 0) { |
|
if (db->tag == tag) { |
|
return db; |
|
} |
|
db++; |
|
} |
|
return NULL; |
|
} |
|
|
|
/* tag に対する送信制御 */ |
|
static void mcdb_ctl(mcdb *db, int tag, int flag) |
|
{ |
|
mcdb *e = mcdb_lookup(db, tag); |
|
if (e != NULL) { |
|
e->flag = flag; |
|
} |
|
} |
|
|
|
/* 全データに対する送信制御 */ |
|
static void mcdb_ctl_all(mcdb *db, int flag) |
|
{ |
|
while (db->tag != 0) { |
|
db->flag = flag; |
|
db++; |
|
} |
|
} |
|
|
|
/* 送信許可されている tag のリストを得る */ |
|
static cmo_list *mcdb_get_allow_all(mcdb *db) |
|
{ |
|
cmo_list *list = new_cmo_list(); |
|
while (db->tag != 0) { |
|
if (db->flag == MATHCAP_FLAG_ALLOW) { |
|
list_append(list, (cmo *)new_cmo_int32(db->tag)); |
|
} |
|
db++; |
|
} |
|
return list; |
|
} |
|
|
static struct { |
static struct { |
int version; |
int version; |
char *version_string; |
char *version_string; |
|
|
/* 次の tag をもつ cmo の送信が許可されているかを調べる */ |
/* 次の tag をもつ cmo の送信が許可されているかを調べる */ |
static int mathcap_cmo_isallow_tag(int tag) |
static int mathcap_cmo_isallow_tag(int tag) |
{ |
{ |
mc_cell *e = mathcap_cmo; |
mcdb *e = mathcap_cmo; |
while (e->tag != 0 && e->tag != tag) { |
while (e->tag != 0 && e->tag != tag) { |
e++; |
e++; |
} |
} |
return e->flag; |
return e->flag; |
} |
} |
|
|
/* 次の tag についてのキーを探す */ |
|
static mc_cell *mathcap_cmo_lookup(int tag) |
|
{ |
|
mc_cell *e = mathcap_cmo; |
|
while (e->tag != 0) { |
|
if (e->tag == tag) { |
|
return e; |
|
} |
|
e++; |
|
} |
|
return NULL; |
|
} |
|
|
|
static int mathcap_cmo_isallow_cmo_list(cmo_list *ob) |
static int mathcap_cmo_isallow_cmo_list(cmo_list *ob) |
{ |
{ |
cell *el; |
cell *el; |
Line 101 static int mathcap_cmo_isallow_cmo_list(cmo_list *ob) |
|
Line 165 static int mathcap_cmo_isallow_cmo_list(cmo_list *ob) |
|
return MATHCAP_FLAG_DENY; |
return MATHCAP_FLAG_DENY; |
} |
} |
|
|
|
__inline__ |
static int mathcap_cmo_isallow_cmo_monomial32(cmo_monomial32 *ob) |
static int mathcap_cmo_isallow_cmo_monomial32(cmo_monomial32 *ob) |
{ |
{ |
return mathcap_cmo_isallow_tag(ob->tag) |
return mathcap_cmo_isallow_tag(ob->tag) |
&& mathcap_cmo_isallow_cmo(ob->coef); |
&& mathcap_cmo_isallow_cmo(ob->coef); |
} |
} |
|
|
|
__inline__ |
static int mathcap_cmo_isallow_cmo_mathcap(cmo_mathcap *ob) |
static int mathcap_cmo_isallow_cmo_mathcap(cmo_mathcap *ob) |
{ |
{ |
return mathcap_cmo_isallow_tag(ob->tag) |
return mathcap_cmo_isallow_tag(ob->tag) |
Line 134 int mathcap_cmo_isallow_cmo(cmo *ob) |
|
Line 200 int mathcap_cmo_isallow_cmo(cmo *ob) |
|
} |
} |
|
|
/* 次の tag をもつ cmo の送信を許可する */ |
/* 次の tag をもつ cmo の送信を許可する */ |
void mathcap_cmo_allow(int tag) |
__inline__ |
|
static void mathcap_cmo_allow(int tag) |
{ |
{ |
mc_cell *e = mathcap_cmo_lookup(tag); |
mcdb_ctl(mathcap_cmo, tag, MATHCAP_FLAG_ALLOW); |
if (e != NULL) { |
|
e->flag = MATHCAP_FLAG_ALLOW; |
|
} |
|
} |
} |
|
|
/* 次の tag をもつ cmo の送信を不許可にする */ |
/* 次の tag をもつ cmo の送信を不許可にする */ |
void mathcap_cmo_deny(int tag) |
__inline__ |
|
static void mathcap_cmo_deny(int tag) |
{ |
{ |
mc_cell *e = mathcap_cmo_lookup(tag); |
mcdb_ctl(mathcap_cmo, tag, MATHCAP_FLAG_DENY); |
if (e != NULL) { |
|
e->flag = MATHCAP_FLAG_DENY; |
|
} |
|
} |
} |
|
|
/* 全ての種類の cmo の送信を不許可にする */ |
/* 全ての種類の cmo の送信を不許可にする */ |
void mathcap_cmo_deny_all() |
__inline__ |
|
static void mathcap_cmo_deny_all() |
{ |
{ |
mc_cell *e = mathcap_cmo; |
mcdb_ctl_all(mathcap_cmo, MATHCAP_FLAG_DENY); |
while (e->tag != 0) { |
|
e->flag = MATHCAP_FLAG_DENY; |
|
e++; |
|
} |
|
} |
} |
|
|
/* 全ての種類の cmo の送信を許可する */ |
/* 全ての種類の cmo の送信を許可する */ |
void mathcap_cmo_allow_all() |
__inline__ |
|
static void mathcap_cmo_allow_all() |
{ |
{ |
mc_cell *e = mathcap_cmo; |
mcdb_ctl_all(mathcap_cmo, MATHCAP_FLAG_ALLOW); |
while (e->tag != 0) { |
|
e->flag = MATHCAP_FLAG_ALLOW; |
|
e++; |
|
} |
|
} |
} |
|
|
/* 送信許可されている cmo のリストを得る */ |
/* 送信許可されている cmo のリストを得る */ |
cmo_list *mathcap_cmo_get_allow_all() |
cmo_list *mathcap_cmo_get_allow_all() |
{ |
{ |
cmo_list *list = new_cmo_list(); |
return mcdb_get_allow_all(mathcap_cmo); |
mc_cell *e = mathcap_cmo; |
|
while (e->tag != 0) { |
|
if (e->flag != MATHCAP_FLAG_DENY) { |
|
list_append(list, new_cmo_int32(e->tag)); |
|
} |
|
e++; |
|
} |
|
return list; |
|
} |
} |
|
|
/* 既知の sm コマンドのリストを得る */ |
/* 既知の sm コマンドのリストを得る */ |
cmo_list *mathcap_sm_get_all() |
__inline__ |
|
static cmo_list *mathcap_sm_get_all() |
{ |
{ |
cmo_list *list = new_cmo_list(); |
return mcdb_get_allow_all(mathcap_sm); |
int i; |
|
for(i=0; mathcap_sm[i] != 0; i++) { |
|
list_append(list, new_cmo_int32(mathcap_sm[i])); |
|
} |
|
return list; |
|
} |
} |
|
|
/* システム情報を得る */ |
/* システム情報を得る */ |
cmo_list *mathcap_sysinfo_get_all() |
static cmo_list *mathcap_sysinfo_get_all() |
{ |
{ |
cmo_list *syslist = new_cmo_list(); |
cmo_list *syslist = new_cmo_list(); |
cmo_int32 *ver = new_cmo_int32(mathcap_sysinfo.version); |
cmo_int32 *ver = new_cmo_int32(mathcap_sysinfo.version); |
Line 271 static cmo_list *get_messagetypes(cmo_list *ob, int ty |
|
Line 315 static cmo_list *get_messagetypes(cmo_list *ob, int ty |
|
|
|
/* cmo_mathcap->ob = ( (...), (...), ( ( cmo_int32, (...) ), ...), ...) */ |
/* cmo_mathcap->ob = ( (...), (...), ( ( cmo_int32, (...) ), ...), ...) */ |
/* ^^^^^ Here! */ |
/* ^^^^^ Here! */ |
|
__inline__ |
static cmo_list *cmo_mathcap_get_cmotypes(cmo_mathcap *mc) |
static cmo_list *cmo_mathcap_get_cmotypes(cmo_mathcap *mc) |
{ |
{ |
cmo_list *ob = (cmo_list *)list_nth((cmo_list *)mc->ob, 2); |
cmo_list *ob = (cmo_list *)list_nth((cmo_list *)mc->ob, 2); |
Line 289 void mathcap_update(cmo_mathcap *mc) |
|
Line 334 void mathcap_update(cmo_mathcap *mc) |
|
} |
} |
} |
} |
} |
} |
|
|
/* 互換性のため */ |
|
cmo* make_mathcap_object(int version, char *id_string) |
|
{ |
|
mathcap_sysinfo_set(version, id_string, "ox_math"); |
|
return (cmo *)mathcap_get(); |
|
} |
|
|
|