[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.1 and 1.17

version 1.1, 2000/10/10 05:23:20 version 1.17, 2016/08/23 02:24:19
Line 1 
Line 1 
 /* -*- mode: C; coding: euc-japan -*- */  /* -*- mode: C; coding: euc-japan -*- */
 /* $OpenXM$ */  /* $OpenXM: OpenXM/src/ox_toolkit/mathcap.c,v 1.16 2016/06/29 05:07:23 ohara Exp $ */
   
 /* This module includes functions for handling mathcap databases. */  /* This module includes functions for handling mathcap databases. */
   
 #include <stdlib.h>  #include <stdlib.h>
   #include <string.h>
 #include "ox_toolkit.h"  #include "ox_toolkit.h"
   
 typedef struct {  #define MATHCAP_FLAG_DENY   0
     int tag;  #define MATHCAP_FLAG_ALLOW  1
     int flag;  
 } mc_cell;  
   
 static int mathcap_cmo_isallow_tag(int tag);  static void table_init(table *m, int key);
 static mc_cell *mathcap_cmo_lookup(int tag);  static table *new_table(int *src);
 static int mathcap_cmo_isallow_cmo_list(cmo_list *ob);  static table *table_lookup(table *tbl, int tag);
 static int mathcap_cmo_isallow_cmo_monomial32(cmo_monomial32 *ob);  static void table_ctl(table *tbl, int tag, int flag);
 static int mathcap_cmo_isallow_cmo_mathcap(cmo_mathcap *ob);  static void table_ctl_all(table *tbl, int flag);
   static cmo_list *table_get_all(table *tbl);
   static void table_allow(table *tbl, int tag);
   static void table_deny(table *tbl, int tag);
   static void table_update(table *cmotbl, cmo_list* types);
   static int table_allowQ_tag(table *tbl, int tag);
   static int table_allowQ_cmo_list(table *cmotbl, cmo_list *ob);
   static int table_allowQ_cmo_monomial32(table *cmotbl, cmo_monomial32 *ob);
   static int table_allowQ_cmo_mathcap(table *cmotbl, cmo_mathcap *ob);
   static int table_allowQ_cmo(table *cmotbl, cmo *ob);
   static cmo_list *sysinfo_get();
 static char *new_string(char *s);  static char *new_string(char *s);
 static void mathcap_cmo_update(cmo_list* types);  static int *new_int_array(int *array);
 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 *cmo_mathcap_get_cmotypes(cmo_mathcap *mc);
 static cmo_list *get_messagetypes(cmo_list *ob, int type);  
 static cmo_list *cmo_mathcap_get_cmotypes(cmo_mathcap *mc);  
   
 static mc_cell mathcap_cmo[] = {  static int cmotbl_a[] = {
     {CMO_NULL,       MATHCAP_FLAG_ALLOW},      CMO_NULL,
     {CMO_INT32,      MATHCAP_FLAG_ALLOW},      CMO_INT32,
     {CMO_DATUM,      MATHCAP_FLAG_ALLOW},      CMO_DATUM,
     {CMO_STRING,     MATHCAP_FLAG_ALLOW},      CMO_STRING,
     {CMO_MATHCAP,    MATHCAP_FLAG_ALLOW},      CMO_MATHCAP,
     {CMO_LIST,       MATHCAP_FLAG_ALLOW},      CMO_LIST,
     {CMO_MONOMIAL32, MATHCAP_FLAG_ALLOW},      CMO_MONOMIAL32,
     {CMO_ZZ,         MATHCAP_FLAG_ALLOW},      CMO_ZZ,
     {CMO_ZERO,       MATHCAP_FLAG_ALLOW},      CMO_QQ,
     {CMO_DMS_GENERIC, MATHCAP_FLAG_ALLOW},      CMO_BIGFLOAT32,
     {CMO_RING_BY_NAME, MATHCAP_FLAG_ALLOW},      CMO_COMPLEX,
     {CMO_INDETERMINATE, MATHCAP_FLAG_ALLOW},      CMO_IEEE_DOUBLE_FLOAT,
     {CMO_DISTRIBUTED_POLYNOMIAL, MATHCAP_FLAG_ALLOW},      CMO_ZERO,
     {CMO_ERROR2,     MATHCAP_FLAG_ALLOW},      CMO_DMS_GENERIC,
     {0,              MATHCAP_FLAG_DENY}      CMO_RING_BY_NAME,
       CMO_INDETERMINATE,
       CMO_DISTRIBUTED_POLYNOMIAL,
       CMO_RECURSIVE_POLYNOMIAL,
       CMO_POLYNOMIAL_IN_ONE_VARIABLE,
       CMO_ERROR2,
       0,
 };  };
   
 static int mathcap_sm[] = {  static int smtbl_a[] = {
     SM_popCMO,      SM_popCMO,
     SM_popString,      SM_popString,
     SM_mathcap,      SM_mathcap,
Line 52  static int mathcap_sm[] = {
Line 65  static int mathcap_sm[] = {
     SM_shutdown,      SM_shutdown,
     SM_control_kill,      SM_control_kill,
     SM_control_reset_connection,      SM_control_reset_connection,
     0      SM_control_spawn_server,
       SM_control_terminate_server,
       0,
 };  };
   
 static struct {  static struct {
Line 60  static struct {
Line 75  static struct {
     char *version_string;      char *version_string;
     char *sysname;      char *sysname;
     char *hosttype;      char *hosttype;
 } mathcap_sysinfo = {0, "NO VERSION", "NONAME", "UNKNOWN"};      int  *cmo_tags;
       int  *sm_cmds;
           char **opts;
   } sysinfo = {0, "NO VERSION", "NONAME", "UNKNOWN", cmotbl_a, smtbl_a, NULL};
   
 /* 次の tag をもつ cmo の送信が許可されているかを調べる */  __inline__
 static int mathcap_cmo_isallow_tag(int tag)  static void table_init(table *m, int key)
 {  {
     mc_cell *e = mathcap_cmo;      m->tag  = key;
     while (e->tag != 0 && e->tag != tag) {      m->flag = MATHCAP_FLAG_ALLOW;
         e++;  }
   
   static table *new_table(int *src)
   {
       table *new;
       int len=0;
       int i;
       while (src[len++] != 0) {
     }      }
     return e->flag;      new = MALLOC(sizeof(table)*len);
       for(i=0; i<len; i++) {
           table_init(new+i, src[i]);
       }
       return new;
 }  }
   
 /* 次の tag についてのキーを探す */  /* looking for an item of the tag */
 static mc_cell *mathcap_cmo_lookup(int tag)  static table *table_lookup(table *tbl, int tag)
 {  {
     mc_cell *e = mathcap_cmo;      while (tbl->tag != 0) {
     while (e->tag != 0) {          if (tbl->tag == tag) {
         if (e->tag == tag) {              return tbl;
             return e;  
         }          }
         e++;          tbl++;
     }      }
     return NULL;      return NULL;
 }  }
   
 static int mathcap_cmo_isallow_cmo_list(cmo_list *ob)  /* controller about a cmo identified by the tag */
   static void table_ctl(table *tbl, int tag, int flag)
 {  {
       table *e = table_lookup(tbl, tag);
       if (e != NULL) {
           e->flag = flag;
       }
   }
   
   /* controller about all CMObjects */
   static void table_ctl_all(table *tbl, int flag)
   {
       while (tbl->tag != 0) {
           tbl->flag = flag;
           tbl++;
       }
   }
   
   /* getting the list of tags of all allowed objects */
   static cmo_list *table_get_all(table *tbl)
   {
       cmo_list *list = new_cmo_list();
       while (tbl->tag != 0) {
           if (tbl->flag == MATHCAP_FLAG_ALLOW) {
               list_append(list, (cmo *)new_cmo_int32(tbl->tag));
           }
           tbl++;
       }
       return list;
   }
   
   /* giving a permssion to send objects identified by the tag. */
   __inline__
   static void table_allow(table *tbl, int tag)
   {
       table_ctl(tbl, tag, MATHCAP_FLAG_ALLOW);
   }
   
   /* taking a permssion to send objects identified by the tag. */
   __inline__
   static void table_deny(table *tbl, int tag)
   {
       table_ctl(tbl, tag, MATHCAP_FLAG_DENY);
   }
   
   static void table_update(table *cmotbl, cmo_list* types)
   {
       cell *el = list_first(types);
       cmo_int32 *ob;
       while(!list_endof(types, el)) {
           ob = (cmo_int32 *)el->cmo;
           if (ob->tag == CMO_INT32) {
               table_allow(cmotbl, ob->i);
           }
           el = list_next(el);
       }
   }
   
   /* getting a permission to send objects identified by the tag. */
   static int table_allowQ_tag(table *tbl, int tag)
   {
       while (tbl->tag != 0 && tbl->tag != tag) {
           tbl++;
       }
       return tbl->flag;
   }
   
   static int table_allowQ_cmo_list(table *cmotbl, cmo_list *ob)
   {
     cell *el;      cell *el;
     if (mathcap_cmo_isallow_tag(ob->tag)) {      if (table_allowQ_tag(cmotbl, ob->tag)) {
         el = list_first(ob);          el = list_first(ob);
         while (!list_endof(ob, el)) {          while (!list_endof(ob, el)) {
             if (!mathcap_cmo_isallow_cmo(el->cmo)) {              if (!table_allowQ_cmo(cmotbl, el->cmo)) {
                 return MATHCAP_FLAG_DENY;                  return MATHCAP_FLAG_DENY;
             }              }
             el = list_next(el);              el = list_next(el);
Line 101  static int mathcap_cmo_isallow_cmo_list(cmo_list *ob)
Line 196  static int mathcap_cmo_isallow_cmo_list(cmo_list *ob)
     return MATHCAP_FLAG_DENY;      return MATHCAP_FLAG_DENY;
 }  }
   
 static int mathcap_cmo_isallow_cmo_monomial32(cmo_monomial32 *ob)  __inline__
   static int table_allowQ_cmo_monomial32(table *cmotbl, cmo_monomial32 *ob)
 {  {
     return mathcap_cmo_isallow_tag(ob->tag)      return table_allowQ_tag(cmotbl, ob->tag)
         && mathcap_cmo_isallow_cmo(ob->coef);          && table_allowQ_cmo(cmotbl, ob->coef);
 }  }
   
 static int mathcap_cmo_isallow_cmo_mathcap(cmo_mathcap *ob)  __inline__
   static int table_allowQ_cmo_mathcap(table *cmotbl, cmo_mathcap *ob)
 {  {
     return mathcap_cmo_isallow_tag(ob->tag)      return table_allowQ_tag(cmotbl, ob->tag)
         && mathcap_cmo_isallow_cmo(ob->ob);          && table_allowQ_cmo(cmotbl, ob->ob);
 }  }
   
 /* 次の cmo の送信が許可されているかを調べる */  /* getting a permission to send the following object. */
 int mathcap_cmo_isallow_cmo(cmo *ob)  static int table_allowQ_cmo(table *cmotbl, 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 mathcap_cmo_isallow_cmo_list((cmo_list *)ob);          return table_allowQ_cmo_list(cmotbl, (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 mathcap_cmo_isallow_cmo_mathcap((cmo_mathcap *)ob);          return table_allowQ_cmo_mathcap(cmotbl, (cmo_mathcap *)ob);
     case CMO_MONOMIAL32:      case CMO_MONOMIAL32:
         return mathcap_cmo_isallow_cmo_monomial32((cmo_monomial32 *)ob);          return table_allowQ_cmo_monomial32(cmotbl, (cmo_monomial32 *)ob);
     default:      default:
         return mathcap_cmo_isallow_tag(tag);          return table_allowQ_tag(cmotbl, tag);
     }      }
 }  }
   
 /* 次の tag をもつ cmo の送信を許可する */  /* getting the System Information */
 void mathcap_cmo_allow(int tag)  static cmo_list *sysinfo_get()
 {  {
     mc_cell *e = mathcap_cmo_lookup(tag);      cmo_list *syslist = new_cmo_list();
     if (e != NULL) {      cmo_int32 *ver    = new_cmo_int32(sysinfo.version);
         e->flag = MATHCAP_FLAG_ALLOW;      cmo_string *vers  = new_cmo_string(sysinfo.version_string);
     }      cmo_string *host  = new_cmo_string(sysinfo.hosttype);
       cmo_string *sname = new_cmo_string(sysinfo.sysname);
       return list_appendl(syslist, ver, sname, vers, host, NULL);
 }  }
   
 /* 次の tag をもつ cmo の送信を不許可にする */  static char *new_string(char *s)
 void mathcap_cmo_deny(int tag)  
 {  {
     mc_cell *e = mathcap_cmo_lookup(tag);      char *t = MALLOC(strlen(s)+1);
     if (e != NULL) {      strcpy(t, s);
         e->flag = MATHCAP_FLAG_DENY;      return t;
     }  
 }  }
   
 /* 全ての種類の cmo の送信を不許可にする */  static int *new_int_array(int *array)
 void mathcap_cmo_deny_all()  
 {  {
     mc_cell *e = mathcap_cmo;      int *new_array;
     while (e->tag != 0) {      int length = 0;
         e->flag = MATHCAP_FLAG_DENY;      while(array[length++] != 0)
         e++;          ;
     }      new_array = MALLOC(sizeof(int)*length);
       return memcpy(new_array, array, sizeof(int)*length);
 }  }
   
 /* 全ての種類の cmo の送信を許可する */  void mathcap_init(int ver, char *vstr, char *sysname, int cmos[], int sms[])
 void mathcap_cmo_allow_all()  
 {  {
     mc_cell *e = mathcap_cmo;      mathcap_init2(ver, vstr, sysname, cmos, sms, NULL);
     while (e->tag != 0) {  
         e->flag = MATHCAP_FLAG_ALLOW;  
         e++;  
     }  
 }  }
   
 /* 送信許可されている cmo のリストを得る */  /* src must be terminated by NULL */
 cmo_list *mathcap_cmo_get_allow_all()  static char **clone_str_list(char **src)
 {  {
     cmo_list *list = new_cmo_list();      int i,len;
     mc_cell *e = mathcap_cmo;      char **new = NULL;
     while (e->tag != 0) {      if(!src) {
         if (e->flag != MATHCAP_FLAG_DENY) {          for(len=0; src[len]!=NULL; len++) {
             list_append(list, new_cmo_int32(e->tag));  
         }          }
         e++;          new = (char **)MALLOC(sizeof(char *)*(len+1));
           new[len] = NULL;
           for(i=0; i<len; i++) {
               new[i] = (char *)MALLOC(strlen(src[i])+1);
               strcpy(new[i], src[i]);
           }
     }      }
     return list;      return new;
 }  }
   
 /* 既知の sm コマンドのリストを得る */  /* options must be terminated by NULL */
 cmo_list *mathcap_sm_get_all()  void mathcap_init2(int ver, char *vstr, char *sysname, int cmos[], int sms[], char *options[])
 {  {
     cmo_list *list = new_cmo_list();      char *host = getenv("HOSTTYPE");
     int i;      sysinfo.hosttype = (host != NULL)? new_string(host): "UNKNOWN";
     for(i=0; mathcap_sm[i] != 0; i++) {      sysinfo.sysname  = new_string(sysname);
         list_append(list, new_cmo_int32(mathcap_sm[i]));      sysinfo.version_string = new_string(vstr);
       sysinfo.version  = ver;
       if (cmos != NULL) {
           sysinfo.cmo_tags = new_int_array(cmos);
     }      }
     return list;      if (sms != NULL) {
           sysinfo.sm_cmds = new_int_array(sms);
       }
       sysinfo.opts = clone_str_list(options);
 }  }
   
 /* システム情報を得る */  mathcap *new_mathcap()
 cmo_list *mathcap_sysinfo_get_all()  
 {  {
     cmo_list *syslist = new_cmo_list();      mathcap *new = MALLOC(sizeof(mathcap));
     cmo_int32 *ver    = new_cmo_int32(mathcap_sysinfo.version);      new->cmotbl = new_table(sysinfo.cmo_tags);
     cmo_string *vers  = new_cmo_string(mathcap_sysinfo.version_string);      new->smtbl  = new_table(sysinfo.sm_cmds);
     cmo_string *host  = new_cmo_string(mathcap_sysinfo.hosttype);      new->opts   = clone_str_list(sysinfo.opts);
     cmo_string *sname = new_cmo_string(mathcap_sysinfo.sysname);      return new;
     return list_appendl(syslist, ver, sname, vers, host);  
 }  }
   
 static char *new_string(char *s)  /* generating a cmo_mathcap by a local database. */
   cmo_mathcap* mathcap_get(mathcap *this)
 {  {
     char *t = malloc(sizeof(s)+1);  
     strcpy(t, s);  
     return t;  
 }  
   
 void mathcap_sysinfo_set(int version, char *version_string, char *sysname)  
 {  
     char *host = getenv("HOSTTYPE");  
   
     mathcap_sysinfo.hosttype = (host != NULL)? new_string(host): "UNKNOWN";  
     mathcap_sysinfo.sysname  = new_string(sysname);  
     mathcap_sysinfo.version_string = new_string(version_string);  
     mathcap_sysinfo.version  = version;  
 }  
   
 /* データベースから cmo_mathcap を生成する */  
 cmo_mathcap* mathcap_get()  
 {  
     cmo_list *mc = new_cmo_list();      cmo_list *mc = new_cmo_list();
     cmo_list *l3 = new_cmo_list();      cmo_list *l3 = new_cmo_list();
     list_append(l3, list_appendl(new_cmo_list(), new_cmo_int32(OX_DATA), mathcap_cmo_get_allow_all(), NULL));      cmo_list *si = sysinfo_get();
     list_appendl(mc, (cmo *)mathcap_sysinfo_get_all(), (cmo *)mathcap_sm_get_all(), (cmo *)l3, NULL);      cmo_list *sm=  table_get_all(this->smtbl);
     return new_cmo_mathcap((cmo *)mc);      cmo_list *opts;
 }      int i;
   
 static void mathcap_cmo_update(cmo_list* types)      list_append(l3, (cmo *)list_appendl(new_cmo_list(),
 {                                   new_cmo_int32(OX_DATA),
     cell *el = list_first(types);                                   table_get_all(this->cmotbl), NULL));
     cmo_int32 *ob;      if(this->opts) {
     while(!list_endof(types, el)) {          opts = new_cmo_list();
         ob = (cmo_int32 *)el->cmo;          for(i=0; this->opts[i]!=NULL; i++) {
         if (ob->tag == CMO_INT32) {              list_append(opts, (cmo *)new_cmo_string(this->opts[i]));
             mathcap_cmo_allow(ob->i);  
         }          }
         el = list_next(el);          list_appendl(mc, (cmo *)si, (cmo *)sm, (cmo *)l3, (cmo *)opts, NULL);
       }else {
           list_appendl(mc, (cmo *)si, (cmo *)sm, (cmo *)l3, NULL);
     }      }
       return new_cmo_mathcap((cmo *)mc);
 }  }
   
 /* cmo_mathcap が妥当な構造を持つかを調べる.  (未実装) */  
 int cmo_mathcap_isvalid(cmo_mathcap *mc)  
 {  
     return 1;  
 }  
   
 /* ( ..., ( type, (...) ), (cmo_int32, (...) ), ... )  */  /* ( ..., ( type, (...) ), (cmo_int32, (...) ), ... )  */
 /*                ^^^^^ Here!                          */  /*                ^^^^^ Here!                          */
 static cmo_list *get_messagetypes(cmo_list *ob, int type)  static cmo_list *get_messagetypes(cmo_list *ob, int type)
Line 271  static cmo_list *get_messagetypes(cmo_list *ob, int ty
Line 350  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);
     return get_messagetypes(ob, OX_DATA);      return get_messagetypes(ob, OX_DATA);
 }  }
   
 /* 受信した mathcap データを反映させる */  /* The mathcap_update integrates received cmo_mathcap into the mathcap
 void mathcap_update(cmo_mathcap *mc)     database. If this == NULL, then an instance of mathcap is generated. */
   mathcap *mathcap_update(mathcap *this, cmo_mathcap *mc)
 {  {
     cmo_list *types;      cmo_list *types;
     if (cmo_mathcap_isvalid(mc)) {      types = cmo_mathcap_get_cmotypes(mc);
         types = cmo_mathcap_get_cmotypes(mc);      if (types != NULL) {
         if (types != NULL) {          table_ctl_all(this->cmotbl, MATHCAP_FLAG_DENY);
             mathcap_cmo_deny_all(); /* すべての cmo の送信を禁止 */          table_update(this->cmotbl, types);
             mathcap_cmo_update(types);  
         }  
     }      }
   
       return this;
 }  }
   
 /* 互換性のため */  int mathcap_allowQ_cmo(mathcap *this, cmo *ob)
 cmo* make_mathcap_object(int version, char *id_string)  
 {  {
     mathcap_sysinfo_set(version, id_string, "ox_math");      return table_allowQ_cmo(this->cmotbl, ob);
     return (cmo *)mathcap_get();  
 }  }
   

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.17

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