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

Diff for /OpenXM/src/ox_toolkit/mathcap.c between version 1.3 and 1.4

version 1.3, 2000/11/18 05:49:18 version 1.4, 2000/11/21 07:59:08
Line 1 
Line 1 
 /* -*- mode: C; coding: euc-japan -*- */  /* -*- mode: C; coding: euc-japan -*- */
 /* $OpenXM: OpenXM/src/ox_toolkit/mathcap.c,v 1.2 2000/10/12 15:40:41 ohara Exp $ */  /* $OpenXM: OpenXM/src/ox_toolkit/mathcap.c,v 1.3 2000/11/18 05:49:18 ohara Exp $ */
   
 /* This module includes functions for handling mathcap databases. */  /* This module includes functions for handling mathcap databases. */
   
Line 7 
Line 7 
 #include "ox_toolkit.h"  #include "ox_toolkit.h"
   
 /* 送信許可されている cmo, sm のリストを得る */  /* 送信許可されている cmo, sm のリストを得る */
 #define smdb_get_allow_all(x)   mcdb_get_allow_all((x)->sm_db)  #define smdb_get_allow_all(x)   mcdb_get_allow_all((x))
 #define cmodb_get_allow_all(x)  mcdb_get_allow_all((x)->cmo_db)  #define cmodb_get_allow_all(x)  mcdb_get_allow_all((x))
   
 /* 全ての種類の cmo の送信を許可/不許可にする */  /* 全ての種類の cmo の送信を許可/不許可にする */
 #define cmodb_deny_all(x)   mcdb_ctl_all((x), MATHCAP_FLAG_DENY)  #define cmodb_deny_all(x)   mcdb_ctl_all((x), MATHCAP_FLAG_DENY)
Line 20  typedef struct {
Line 20  typedef struct {
 } mcdb;  } mcdb;
   
 typedef struct {  typedef struct {
     mcdb *cmo_db;      mcdb *cmodb;
     mcdb *sm_db;      mcdb *smdb;
 } mathcap;  } mathcap;
   
 static char *new_string(char *s);  static char *new_string(char *s);
Line 29  static cmo_list *cmo_mathcap_get_cmotypes(cmo_mathcap 
Line 29  static cmo_list *cmo_mathcap_get_cmotypes(cmo_mathcap 
 static cmo_list *get_messagetypes(cmo_list *ob, int type);  static cmo_list *get_messagetypes(cmo_list *ob, int type);
 static cmo_list *mcdb_get_allow_all(mcdb *db);  static cmo_list *mcdb_get_allow_all(mcdb *db);
 static cmo_list *sysinfo_get_all();  static cmo_list *sysinfo_get_all();
 static int cmodb_isallow_cmo(mcdb *cmo_db, cmo *ob);  static int cmodb_isallow_cmo(mcdb *cmodb, cmo *ob);
 static int cmodb_isallow_cmo_list(mcdb *cmo_db, cmo_list *ob);  static int cmodb_isallow_cmo_list(mcdb *cmodb, cmo_list *ob);
 static int cmodb_isallow_cmo_mathcap(mcdb *cmo_db, cmo_mathcap *ob);  static int cmodb_isallow_cmo_mathcap(mcdb *cmodb, cmo_mathcap *ob);
 static int cmodb_isallow_cmo_monomial32(mcdb *cmo_db, cmo_monomial32 *ob);  static int cmodb_isallow_cmo_monomial32(mcdb *cmodb, cmo_monomial32 *ob);
 static int cmodb_isallow_tag(mcdb *cmo_db, int tag);  static int cmodb_isallow_tag(mcdb *cmodb, int tag);
 static mcdb *mcdb_lookup(mcdb *db, int tag);  static mcdb *mcdb_lookup(mcdb *db, int tag);
 static mcdb *new_mcdb(int *src);  static mcdb *new_mcdb(int *src);
 static void cmodb_allow(mcdb *cmo_db, int tag);  static void cmodb_allow(mcdb *cmodb, int tag);
 static void cmodb_deny(mcdb *cmo_db, int tag);  static void cmodb_deny(mcdb *cmodb, int tag);
 static void cmodb_update(mcdb *cmo_db, cmo_list* types);  static void cmodb_update(mcdb *cmodb, cmo_list* types);
 static void mcdb_ctl(mcdb *db, int tag, int flag);  static void mcdb_ctl(mcdb *db, int tag, int flag);
 static void mcdb_ctl_all(mcdb *db, int flag);  static void mcdb_ctl_all(mcdb *db, int flag);
 static void mcdb_init(mcdb *m, int key);  static void mcdb_init(mcdb *m, int key);
 void sysinfo_set(int version, char *version_string, char *sysname);  static void sysinfo_set(int version, char *version_string, char *sysname);
   
 static int cmodb_d[] = {  static int cmodb_d[] = {
     CMO_NULL,      CMO_NULL,
Line 100  static mcdb *new_mcdb(int *src)
Line 100  static mcdb *new_mcdb(int *src)
 mathcap *new_mathcap_d()  mathcap *new_mathcap_d()
 {  {
     mathcap *new = malloc(sizeof(mathcap));      mathcap *new = malloc(sizeof(mathcap));
     new->cmo_db = new_mcdb(cmodb_d);      new->cmodb = new_mcdb(cmodb_d);
     new->sm_db  = new_mcdb(smdb_d);      new->smdb  = new_mcdb(smdb_d);
     return new;      return new;
 }  }
   
Line 153  static struct {
Line 153  static struct {
     char *version_string;      char *version_string;
     char *sysname;      char *sysname;
     char *hosttype;      char *hosttype;
 } sysinfo = {0, "NO VERSION", "NONAME", "UNKNOWN"};          int  *cmo_tags;
           int  *sm_cmds;
   } sysinfo = {0, "NO VERSION", "NONAME", "UNKNOWN", cmodb_d, smdb_d};
   
 /* 次の tag をもつ cmo の送信が許可されているかを調べる */  /* 次の tag をもつ cmo の送信が許可されているかを調べる */
 static int cmodb_isallow_tag(mcdb *cmo_db, int tag)  static int cmodb_isallow_tag(mcdb *cmodb, int tag)
 {  {
     while (cmo_db->tag != 0 && cmo_db->tag != tag) {      while (cmodb->tag != 0 && cmodb->tag != tag) {
         cmo_db++;          cmodb++;
     }      }
     return cmo_db->flag;      return cmodb->flag;
 }  }
   
 static int cmodb_isallow_cmo_list(mcdb *cmo_db, cmo_list *ob)  static int cmodb_isallow_cmo_list(mcdb *cmodb, cmo_list *ob)
 {  {
     cell *el;      cell *el;
     if (cmodb_isallow_tag(cmo_db, ob->tag)) {      if (cmodb_isallow_tag(cmodb, ob->tag)) {
         el = list_first(ob);          el = list_first(ob);
         while (!list_endof(ob, el)) {          while (!list_endof(ob, el)) {
             if (!cmodb_isallow_cmo(cmo_db, el->cmo)) {              if (!cmodb_isallow_cmo(cmodb, el->cmo)) {
                 return MATHCAP_FLAG_DENY;                  return MATHCAP_FLAG_DENY;
             }              }
             el = list_next(el);              el = list_next(el);
Line 181  static int cmodb_isallow_cmo_list(mcdb *cmo_db, cmo_li
Line 183  static int cmodb_isallow_cmo_list(mcdb *cmo_db, cmo_li
 }  }
   
 __inline__  __inline__
 static int cmodb_isallow_cmo_monomial32(mcdb *cmo_db, cmo_monomial32 *ob)  static int cmodb_isallow_cmo_monomial32(mcdb *cmodb, cmo_monomial32 *ob)
 {  {
     return cmodb_isallow_tag(cmo_db, ob->tag)      return cmodb_isallow_tag(cmodb, ob->tag)
         && cmodb_isallow_cmo(cmo_db, ob->coef);          && cmodb_isallow_cmo(cmodb, ob->coef);
 }  }
   
 __inline__  __inline__
 static int cmodb_isallow_cmo_mathcap(mcdb *cmo_db, cmo_mathcap *ob)  static int cmodb_isallow_cmo_mathcap(mcdb *cmodb, cmo_mathcap *ob)
 {  {
     return cmodb_isallow_tag(cmo_db, ob->tag)      return cmodb_isallow_tag(cmodb, ob->tag)
         && cmodb_isallow_cmo(cmo_db, ob->ob);          && cmodb_isallow_cmo(cmodb, ob->ob);
 }  }
   
 /* 次の cmo の送信が許可されているかを調べる */  /* 次の cmo の送信が許可されているかを調べる */
 static int cmodb_isallow_cmo(mcdb *cmo_db, cmo *ob)  static int cmodb_isallow_cmo(mcdb *cmodb, cmo *ob)
 {  {
     int tag = ob->tag;      int tag = ob->tag;
     switch(tag) {      switch(tag) {
     case CMO_LIST:      case CMO_LIST:
     case CMO_DISTRIBUTED_POLYNOMIAL:      case CMO_DISTRIBUTED_POLYNOMIAL:
         return cmodb_isallow_cmo_list(cmo_db, (cmo_list *)ob);          return cmodb_isallow_cmo_list(cmodb, (cmo_list *)ob);
     case CMO_MATHCAP:      case CMO_MATHCAP:
     case CMO_ERROR2:      case CMO_ERROR2:
     case CMO_RING_BY_NAME:      case CMO_RING_BY_NAME:
     case CMO_INDETERMINATE:      case CMO_INDETERMINATE:
         return cmodb_isallow_cmo_mathcap(cmo_db, (cmo_mathcap *)ob);          return cmodb_isallow_cmo_mathcap(cmodb, (cmo_mathcap *)ob);
     case CMO_MONOMIAL32:      case CMO_MONOMIAL32:
         return cmodb_isallow_cmo_monomial32(cmo_db, (cmo_monomial32 *)ob);          return cmodb_isallow_cmo_monomial32(cmodb, (cmo_monomial32 *)ob);
     default:      default:
         return cmodb_isallow_tag(cmo_db, tag);          return cmodb_isallow_tag(cmodb, tag);
     }      }
 }  }
   
 /* 次の tag をもつ cmo の送信を許可する */  /* 次の tag をもつ cmo の送信を許可する */
 __inline__  __inline__
 static void cmodb_allow(mcdb *cmo_db, int tag)  static void cmodb_allow(mcdb *cmodb, int tag)
 {  {
     mcdb_ctl(cmo_db, tag, MATHCAP_FLAG_ALLOW);      mcdb_ctl(cmodb, tag, MATHCAP_FLAG_ALLOW);
 }  }
   
 /* 次の tag をもつ cmo の送信を不許可にする */  /* 次の tag をもつ cmo の送信を不許可にする */
 __inline__  __inline__
 static void cmodb_deny(mcdb *cmo_db, int tag)  static void cmodb_deny(mcdb *cmodb, int tag)
 {  {
     mcdb_ctl(cmo_db, tag, MATHCAP_FLAG_DENY);      mcdb_ctl(cmodb, tag, MATHCAP_FLAG_DENY);
 }  }
   
 /* システム情報を得る */  /* システム情報を得る */
Line 256  void sysinfo_set(int version, char *vstr, char *sysnam
Line 258  void sysinfo_set(int version, char *vstr, char *sysnam
     sysinfo.version  = version;      sysinfo.version  = version;
 }  }
   
 void mathcap_global_init(int ver, char *vstr, char *sysname, int cmos[], int sms[])  void mathcap_init(int ver, char *vstr, char *sysname, int cmos[], int sms[])
 {  {
         sysinfo_set(ver, vstr, sysname); /* global! */          sysinfo_set(ver, vstr, sysname); /* global! */
         if (cmos == NULL) {          if (cmos == NULL) {
Line 275  cmo_mathcap* mathcap_get(mathcap *this)
Line 277  cmo_mathcap* mathcap_get(mathcap *this)
     cmo_list *l3 = new_cmo_list();      cmo_list *l3 = new_cmo_list();
     list_append(l3, list_appendl(new_cmo_list(),      list_append(l3, list_appendl(new_cmo_list(),
                                  new_cmo_int32(OX_DATA),                                   new_cmo_int32(OX_DATA),
                                  cmodb_get_allow_all(this), NULL));                                   cmodb_get_allow_all(this->cmodb), NULL));
     list_appendl(mc, (cmo *)sysinfo_get_all(),      list_appendl(mc, (cmo *)sysinfo_get_all(),
                  (cmo *)smdb_get_allow_all(this), (cmo *)l3, NULL);                   (cmo *)smdb_get_allow_all(this->smdb), (cmo *)l3, NULL);
     return new_cmo_mathcap((cmo *)mc);      return new_cmo_mathcap((cmo *)mc);
 }  }
   
 static void cmodb_update(mcdb *cmo_db, cmo_list* types)  static void cmodb_update(mcdb *cmodb, cmo_list* types)
 {  {
     cell *el = list_first(types);      cell *el = list_first(types);
     cmo_int32 *ob;      cmo_int32 *ob;
     while(!list_endof(types, el)) {      while(!list_endof(types, el)) {
         ob = (cmo_int32 *)el->cmo;          ob = (cmo_int32 *)el->cmo;
         if (ob->tag == CMO_INT32) {          if (ob->tag == CMO_INT32) {
             cmodb_allow(cmo_db, ob->i);              cmodb_allow(cmodb, ob->i);
         }          }
         el = list_next(el);          el = list_next(el);
     }      }
Line 334  mathcap *mathcap_update(mathcap *this, cmo_mathcap *mc
Line 336  mathcap *mathcap_update(mathcap *this, cmo_mathcap *mc
     if (cmo_mathcap_isvalid(mc)) {      if (cmo_mathcap_isvalid(mc)) {
         types = cmo_mathcap_get_cmotypes(mc);          types = cmo_mathcap_get_cmotypes(mc);
         if (types != NULL) {          if (types != NULL) {
             cmodb_deny_all(this->cmo_db); /* すべての cmo の送信を禁止 */              cmodb_deny_all(this->cmodb); /* すべての cmo の送信を禁止 */
             cmodb_update(this->cmo_db, types);              cmodb_update(this->cmodb, types);
         }          }
     }      }
         return this;          return this;

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.4

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>