[BACK]Return to ext.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / Kan

Diff for /OpenXM/src/kan96xx/Kan/ext.c between version 1.13 and 1.36

version 1.13, 2002/11/10 07:00:05 version 1.36, 2005/06/16 05:07:23
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/kan96xx/Kan/ext.c,v 1.12 2002/10/24 05:19:50 takayama Exp $ */  /* $OpenXM: OpenXM/src/kan96xx/Kan/ext.c,v 1.35 2005/06/09 05:46:57 takayama Exp $ */
 #include <stdio.h>  #include <stdio.h>
 #include <sys/types.h>  #include <sys/types.h>
 #include <sys/stat.h>  #include <sys/stat.h>
Line 12 
Line 12 
 #include "extern2.h"  #include "extern2.h"
 #include <signal.h>  #include <signal.h>
 #include "plugin.h"  #include "plugin.h"
   #include "kclass.h"
 #include <ctype.h>  #include <ctype.h>
   #include <errno.h>
   #include <regex.h>
   #include "ox_pathfinder.h"
   
   extern int Quiet;
   extern char **environ;
   
 #define MYCP_SIZE 100  #define MYCP_SIZE 100
 static int Mychildren[MYCP_SIZE];  static int Mychildren[MYCP_SIZE];
 static int Mycp = 0;  static int Mycp = 0;
   static int Verbose_mywait = 0;
 static void mywait() {  static void mywait() {
   int status;    int status;
   int pid;    int pid;
   int i,j;    int i,j;
   signal(SIGCHLD,SIG_IGN);    /* signal(SIGCHLD,SIG_IGN); */
   pid = wait(&status);    pid = wait(&status);
   fprintf(stderr,"Child process %d is exiting.\n",pid);    if ((!Quiet) && (Verbose_mywait)) fprintf(stderr,"Child process %d is exiting.\n",pid);
   for (i=0; i<Mycp; i++) {    for (i=0; i<Mycp; i++) {
     if (Mychildren[i]  == pid) {      if (Mychildren[i]  == pid) {
       for (j=i; j<Mycp-1; j++) {        for (j=i; j<Mycp-1; j++) {
Line 80  static char *ext_generateUniqueFileName(char *s)
Line 88  static char *ext_generateUniqueFileName(char *s)
   return(NULL);    return(NULL);
 }  }
   
   static struct object oregexec(struct object oregex,struct object ostrArray,struct object oflag);
   
 struct object Kextension(struct object obj)  struct object Kextension(struct object obj)
 {  {
   char *key;    char *key;
   int size;    int size;
   struct object keyo;    struct object keyo = OINIT;
   struct object rob = NullObject;    struct object rob = NullObject;
   struct object obj1,obj2,obj3,obj4;    struct object obj1 = OINIT;
     struct object obj2 = OINIT;
     struct object obj3 = OINIT;
     struct object obj4 = OINIT;
   int m,i,pid, uid;    int m,i,pid, uid;
   int argListc, fdListc;    int argListc, fdListc;
   char *abc;    char *abc;
Line 99  struct object Kextension(struct object obj)
Line 112  struct object Kextension(struct object obj)
 #endif  #endif
   extern void ctrlC();    extern void ctrlC();
   extern int SigIgn;    extern int SigIgn;
   extern errno;  
   extern int DebugCMO;    extern int DebugCMO;
   extern int OXprintMessage;    extern int OXprintMessage;
   struct stat buf;    struct stat buf;
Line 107  struct object Kextension(struct object obj)
Line 119  struct object Kextension(struct object obj)
   FILE *fp;    FILE *fp;
   void (*oldsig)();    void (*oldsig)();
   extern SecureMode;    extern SecureMode;
     extern char *UD_str;
     extern int UD_attr;
   
   if (obj.tag != Sarray) errorKan1("%s\n","Kextension(): The argument must be an array.");    if (obj.tag != Sarray) errorKan1("%s\n","Kextension(): The argument must be an array.");
   size = getoaSize(obj);    size = getoaSize(obj);
Line 140  struct object Kextension(struct object obj)
Line 154  struct object Kextension(struct object obj)
     obj1 = getoa(obj,1);      obj1 = getoa(obj,1);
     if (obj1.tag != Sinteger) errorKan1("%s\n","[(chattrs)  num] extension.");      if (obj1.tag != Sinteger) errorKan1("%s\n","[(chattrs)  num] extension.");
     m = KopInteger(obj1);      m = KopInteger(obj1);
     if (!( m == 0 || m == PROTECT || m == ABSOLUTE_PROTECT))          /* if (!( m == 0 || m == PROTECT || m == ABSOLUTE_PROTECT || m == ATTR_INFIX))
       errorKan1("%s\n","The number must be 0, 1 or 2.");             errorKan1("%s\n","The number must be 0, 1 or 2.");*/
     putUserDictionary2((char *)NULL,0,0,m | SET_ATTR_FOR_ALL_WORDS,      putUserDictionary2((char *)NULL,0,0,m | SET_ATTR_FOR_ALL_WORDS,
                        CurrentContextp->userDictionary);                         CurrentContextp->userDictionary);
     }else if (strcmp(key,"or_attrs")==0) {
       if (size != 2) errorKan1("%s\n","[(or_attrs)  num] extension.");
       obj1 = getoa(obj,1);
       if (obj1.tag != Sinteger) errorKan1("%s\n","[(or_attrs)  num] extension.");
       m = KopInteger(obj1);
       putUserDictionary2((char *)NULL,0,0,m | OR_ATTR_FOR_ALL_WORDS,
                          CurrentContextp->userDictionary);
   }else if (strcmp(key,"keywords")==0) {    }else if (strcmp(key,"keywords")==0) {
     if (size != 1) errorKan1("%s\n","[(keywords)] extension.");      if (size != 1) errorKan1("%s\n","[(keywords)] extension.");
     rob = showSystemDictionary(1);      rob = showSystemDictionary(1);
Line 200  struct object Kextension(struct object obj)
Line 221  struct object Kextension(struct object obj)
       putoa(obj3,0,KpoInteger((int) buf.st_size));        putoa(obj3,0,KpoInteger((int) buf.st_size));
       putoa(rob,1,obj3); /* We have not yet read buf fully */        putoa(rob,1,obj3); /* We have not yet read buf fully */
     }      }
     }else if (strcmp(key,"gethostname")==0) {
       abc = (char *)sGC_malloc(sizeof(char)*1024);
       if (gethostname(abc,1023) < 0) {
             errorKan1("%s\n","hostname could not be obtained.");
           }
           rob = KpoString(abc);
   }else if (strcmp(key,"forkExec")==0) {    }else if (strcmp(key,"forkExec")==0) {
     if (size != 4) errorKan1("%s\n","[(forkExec) argList fdList sigblock] extension.");      if (size != 4) errorKan1("%s\n","[(forkExec) argList fdList sigblock] extension.");
     obj1 = getoa(obj,1);      obj1 = getoa(obj,1);
           if (obj1.tag == Sdollar) {
             obj1 = KstringToArgv(obj1);
           }
     if (obj1.tag != Sarray) errorKan1("%s\n","[(forkExec) argList fdList sigblock] extension. array argList.");      if (obj1.tag != Sarray) errorKan1("%s\n","[(forkExec) argList fdList sigblock] extension. array argList.");
     obj2 = getoa(obj,2);          obj2 = getoa(obj,2);
     if (obj2.tag != Sarray) errorKan1("%s\n","[(forkExec) argList fdList sigblock] extension. array fdList.");      if (obj2.tag != Sarray) errorKan1("%s\n","[(forkExec) argList fdList sigblock] extension. array fdList.");
     obj3 = getoa(obj,3);      obj3 = getoa(obj,3);
     if (obj3.tag != Sinteger) errorKan1("%s\n","[(forkExec) argList fdList sigblock] extension. integer sigblock.");      if (obj3.tag != Sinteger) errorKan1("%s\n","[(forkExec) argList fdList sigblock] extension. integer sigblock.");
Line 255  struct object Kextension(struct object obj)
Line 285  struct object Kextension(struct object obj)
         sleep(5);          sleep(5);
         fprintf(stderr,">>>\n");          fprintf(stderr,">>>\n");
       }        }
       execv(argv[0],argv);        execve(argv[0],argv,environ);
       /* This place will never be reached unless execv fails. */        /* This place will never be reached unless execv fails. */
       fprintf(stderr,"forkExec fails: ");        fprintf(stderr,"forkExec fails: ");
       for (i=0; i<argListc; i++) {        for (i=0; i<argListc; i++) {
Line 285  struct object Kextension(struct object obj)
Line 315  struct object Kextension(struct object obj)
     printObject(obj2,0,fp);      printObject(obj2,0,fp);
     fclose(fp);      fclose(fp);
     rob = NullObject;      rob = NullObject;
     }else if (strcmp(key,"getAttributeList")==0) {
       if (size != 2) errorKan1("%s\n","[(getAttributeList) ob] extension rob");
       rob = KgetAttributeList(getoa(obj,1));
     }else if (strcmp(key,"putAttributeList")==0) {
       if (size != 3) errorKan1("%s\n","[(putAttributeList) ob attrlist] extension rob");
       rob = KputAttributeList(getoa(obj,1), getoa(obj,2));
     }else if (strcmp(key,"getAttribute")==0) {
       if (size != 3) errorKan1("%s\n","[(getAttribute) ob key] extension rob");
       rob = KgetAttribute(getoa(obj,1),getoa(obj,2));
     }else if (strcmp(key,"putAttribute")==0) {
       if (size != 4) errorKan1("%s\n","[(putAttributeList) ob key value] extension rob");
       rob = KputAttribute(getoa(obj,1), getoa(obj,2),getoa(obj,3));
   }else if (strcmp(key,"hilbert")==0) {    }else if (strcmp(key,"hilbert")==0) {
     if (size != 3) errorKan1("%s\n","[(hilbert) obgb obvlist] extension.");      if (size != 3) errorKan1("%s\n","[(hilbert) obgb obvlist] extension.");
     rob = hilberto(getoa(obj,1),getoa(obj,2));      rob = hilberto(getoa(obj,1),getoa(obj,2));
Line 307  struct object Kextension(struct object obj)
Line 349  struct object Kextension(struct object obj)
     if (obj1.tag != Sinteger) errorKan1("%s\n","[(chattr)  num symbol] extension.");      if (obj1.tag != Sinteger) errorKan1("%s\n","[(chattr)  num symbol] extension.");
     if (obj2.tag != Sstring)  errorKan1("%s\n","[(chattr)  num symbol] extension.");      if (obj2.tag != Sstring)  errorKan1("%s\n","[(chattr)  num symbol] extension.");
     m = KopInteger(obj1);      m = KopInteger(obj1);
     if (!( m == 0 || m == PROTECT || m == ABSOLUTE_PROTECT))          /* if (!( m == 0 || m == PROTECT || m == ABSOLUTE_PROTECT || m == ATTR_INFIX))
       errorKan1("%s\n","The number must be 0, 1 or 2.");             errorKan1("%s\n","The number must be 0, 1 or 2.");*/
     putUserDictionary2(obj2.lc.str,(obj2.rc.op->lc).ival,(obj2.rc.op->rc).ival,      putUserDictionary2(obj2.lc.str,(obj2.rc.op->lc).ival,(obj2.rc.op->rc).ival,
                        m,CurrentContextp->userDictionary);                         m,CurrentContextp->userDictionary);
     }else if (strcmp(key,"or_attr")==0) {
       if (size != 3) errorKan1("%s\n","[(or_attr)  num symbol] extension.");
       obj1 = getoa(obj,1);
       obj2 = getoa(obj,2);
       if (obj1.tag != Sinteger) errorKan1("%s\n","[(or_attr)  num symbol] extension.");
       if (obj2.tag != Sstring)  errorKan1("%s\n","[(or_attr)  num symbol] extension.");
       m = KopInteger(obj1);
       rob = KfindUserDictionary(obj2.lc.str);
       if (rob.tag != NoObject.tag) {
         if (strcmp(UD_str,obj2.lc.str) == 0) {
           m |= UD_attr;
         }else errorKan1("%s\n","or_attr: internal error.");
       }
       rob = KpoInteger(m);
       putUserDictionary2(obj2.lc.str,(obj2.rc.op->lc).ival,(obj2.rc.op->rc).ival,
                          m,CurrentContextp->userDictionary);
     }else if (strcmp(key,"getattr")==0) {
       if (size != 2) errorKan1("%s\n","[(getattr) symbol] extension.");
       obj1 = getoa(obj,1);
       if (obj1.tag != Sstring)  errorKan1("%s\n","[(getattr) symbol] extension.");
       rob = KfindUserDictionary(obj1.lc.str);
           if (rob.tag != NoObject.tag) {
             if (strcmp(UD_str,obj1.lc.str) == 0) {
                   rob = KpoInteger(UD_attr);
             }else errorKan1("%s\n","getattr: internal error.");
           }else rob = NullObject;
     }else if (strcmp(key,"getServerEnv")==0) {
       if (size != 2) errorKan1("%s\n","[(getServerEnv) serverName] extension.");
       obj1 = getoa(obj,1);
       if (obj1.tag != Sdollar) errorKan1("%s\n","[(getServerEnv) serverName] extension.");
       {
         char **se; int ii; int nn;
         se = getServerEnv(KopString(obj1));
         if (se == NULL) {
           debugServerEnv(KopString(obj1));
           rob = NullObject;
         }else{
           for (ii=0,nn=0; se[ii] != NULL; ii++) nn++;
           rob = newObjectArray(nn);
           for (ii=0; ii<nn; ii++) {
             putoa(rob,ii,KpoString(se[ii]));
           }
         }
       }
     }else if (strcmp(key,"read")==0) {
       if (size != 3) errorKan1("%s\n","[(read) fd size] extension.");
       obj1 = getoa(obj,1);
       if (obj1.tag != Sinteger) errorKan1("%s\n","[(read) fd size] extension. fd must be an integer.");
       obj2 = getoa(obj,2);
       if (obj2.tag != Sinteger) errorKan1("%s\n","[(read) fd size] extension. size must be an integer.");
       {
         int total, n, fd;
         char *s; char *s0;
         fd = KopInteger(obj1);
         total = KopInteger(obj2);
         if (total <= 0) errorKan1("%s\n","[(read) ...]; negative size has not yet been implemented.");
         /* Return a string. todo: implement SbyteArray case. */
         s0 = s = (char *) sGC_malloc(total+1);
         if (s0 == NULL) errorKan1("%s\n","[(read) ...]; no more memory.");
         while (total >0) {
           n = read(fd, s, total);
           if (n < 0) { perror("read"); errorKan1("%s\n","[(read) ...]; read error.");}
           s[n] = 0;
           total -= n;  s = &(s[n]);
         }
         rob = KpoString(s0);
       }
   }else if (strcmp(key,"regionMatches")==0) {    }else if (strcmp(key,"regionMatches")==0) {
     if (size != 3) errorKan1("%s\n","[(regionMatches) str strArray] extension.");      if (size != 3) errorKan1("%s\n","[(regionMatches) str strArray] extension.");
     obj1 = getoa(obj,1);      obj1 = getoa(obj,1);
Line 318  struct object Kextension(struct object obj)
Line 427  struct object Kextension(struct object obj)
         obj2 = getoa(obj,2);          obj2 = getoa(obj,2);
     if (obj2.tag != Sarray) errorKan1("%s\n","[(regionMatches) str strArray] extension. strArray must be an array.");      if (obj2.tag != Sarray) errorKan1("%s\n","[(regionMatches) str strArray] extension. strArray must be an array.");
     rob = KregionMatches(obj1,obj2);      rob = KregionMatches(obj1,obj2);
     }else if (strcmp(key,"newVector")==0) {
       if (size != 2) errorKan1("%s\n","[(newVector) m] extension.");
       obj1 = getoa(obj,1);
       if (obj1.tag != Sinteger) errorKan1("%s\n","[(newVector) m] extension. m must be an integer.");
       rob = newObjectArray(KopInteger(obj1));
     }else if (strcmp(key,"newMatrix")==0) {
       if (size != 3) errorKan1("%s\n","[(newMatrix) m n] extension.");
       obj1 = getoa(obj,1);
       if (obj1.tag != Sinteger) errorKan1("%s\n","[(newMatrix) m n] extension. m must be an integer.");
           obj2 = getoa(obj,2);
       if (obj2.tag != Sinteger) errorKan1("%s\n","[(newMatrix) m n] extension. n must be an integer.");
       rob = newObjectArray(KopInteger(obj1));
           for (i=0; i<KopInteger(obj1); i++) {
         putoa(rob,i,newObjectArray(KopInteger(obj2)));
           }
     }else if (strcmp(key,"ooPower")==0) {
       if (size != 3) errorKan1("%s\n","[(ooPower) a b] extension.");
       obj1 = getoa(obj,1);
           obj2 = getoa(obj,2);
       rob = KooPower(obj1,obj2);
     }else if (strcmp(key,"Krest")==0) {
       if (size != 2) errorKan1("%s\n","[(Krest) a] extension b");
       obj1 = getoa(obj,1);
       rob = Krest(obj1);
     }else if (strcmp(key,"Kjoin")==0) {
       if (size != 3) errorKan1("%s\n","[(Kjoin) a b] extension c");
       obj1 = getoa(obj,1);
           obj2 = getoa(obj,2);
       rob = Kjoin(obj1,obj2);
   }else if (strcmp(key,"ostype")==0) {    }else if (strcmp(key,"ostype")==0) {
     rob = newObjectArray(1);      rob = newObjectArray(1);
     /* Hard encode the OS type. */      /* Hard encode the OS type. */
Line 326  struct object Kextension(struct object obj)
Line 464  struct object Kextension(struct object obj)
 #else  #else
     putoa(rob,0,KpoString("unix"));      putoa(rob,0,KpoString("unix"));
 #endif  #endif
     }else if (strcmp(key,"traceClearStack")==0) {
       traceClearStack();
       rob = NullObject;
     }else if (strcmp(key,"traceShowStack")==0) {
       char *ssst;
       ssst = traceShowStack();
       if (ssst != NULL) {
         rob = KpoString(ssst);
       }else{
         rob = NullObject;
       }
     }else if (strcmp(key,"regexec")==0) {
       if ((size != 3) && (size != 4)) errorKan1("%s\n","[(regexec) reg strArray flag(optional)] extension b");
       obj1 = getoa(obj,1);
       if (obj1.tag != Sdollar) errorKan1("%s\n","regexec, the first argument should be a string (regular expression).");
       obj2 = getoa(obj,2);
       if (obj2.tag != Sarray) errorKan1("%s\n","regexec, the second argument should be an array of a string.");
       if (size == 3) obj3 = newObjectArray(0);
       else obj3 = getoa(obj,3);
       rob = oregexec(obj1,obj2,obj3);
     }else if (strcmp(key,"unlink")==0) {
       if (size != 2) errorKan1("%s\n","[(unlink) filename] extension b");
       obj1 = getoa(obj,1);
       if (obj1.tag != Sdollar) errorKan1("%s\n","unlink, the first argument should be a string (filename).");
       rob = KpoInteger(oxDeleteFile(KopString(obj1)));
   }    }
 #include "plugin.hh"  #include "plugin.hh"
   #include "Kclass/tree.hh"
   else{    else{
     errorKan1("%s\n","Unknown tag for extension.");          fprintf(stderr,"key=%s; ",key);
       errorKan1("%s\n","Unknown key for extension.");
   }    }
   
   
Line 338  struct object KregionMatches(struct object sobj, struc
Line 503  struct object KregionMatches(struct object sobj, struc
   
 struct object KregionMatches(struct object sobj, struct object keyArray)  struct object KregionMatches(struct object sobj, struct object keyArray)
 {  {
   struct object rob;    struct object rob = OINIT;
   int n,i,j,m,keyn;    int n,i,j,m,keyn;
   char *s,*key;    char *s,*key;
   rob = newObjectArray(3);    rob = newObjectArray(3);
Line 371  struct object KregionMatches(struct object sobj, struc
Line 536  struct object KregionMatches(struct object sobj, struc
   return rob;    return rob;
 }  }
   
   static struct object oregexec(struct object oregex,struct object ostrArray,struct object oflag) {
     struct object rob = OINIT;
     struct object ob = OINIT;
     int n,i,j,m,keyn,cflag,eflag,er;
     char *regex;
     regex_t preg;
     char *s;
     char *mbuf; int mbufSize;
   #define REGMATCH_SIZE 100
     regmatch_t pmatch[100]; size_t nmatch;
     int size;
   
     nmatch = (size_t) REGMATCH_SIZE;
     rob = newObjectArray(0);
     mbufSize = 1024;
   
     if (oregex.tag != Sdollar) return rob;
     if (ostrArray.tag != Sarray) return rob;
     n = getoaSize(ostrArray);
     for (i=0; i<n; i++) {
       if (getoa(ostrArray,i).tag != Sdollar) { return rob; }
     }
     if (oflag.tag != Sarray) errorKan1("%s\n","oregexec: oflag should be an array of integers.");
     cflag = eflag = 0;
     oflag = Kto_int32(oflag);
     for (i=0; i<getoaSize(oflag); i++) {
       ob = getoa(oflag,i);
       if (ob.tag != Sinteger) errorKan1("%s\n","oregexec: oflag is not an array of integers.");
       if (i == 0) cflag = KopInteger(ob);
       if (i == 1) eflag = KopInteger(ob);
     }
   
     regex = KopString(oregex);
     if (er=regcomp(&preg,regex,cflag)) {
       mbuf = (char *) sGC_malloc(mbufSize);
       if (mbuf == NULL) errorKan1("%s\n","No more memory.");
       regerror(er,&preg,mbuf,mbufSize-1);
       errorKan1("regcomp error: %s\n",mbuf);
     }
   
     size = 0; /* We should use list instead of counting the size. */
     for (i=0; i<n; i++) {
       s = KopString(getoa(ostrArray,i));
       er=regexec(&preg,s,nmatch,pmatch,eflag);
       if ((er != 0) && (er != REG_NOMATCH)) {
         mbuf = (char *) sGC_malloc(mbufSize);
         if (mbuf == NULL) errorKan1("%s\n","No more memory.");
         regerror(er,&preg,mbuf,mbufSize-1);
         errorKan1("regcomp error: %s\n",mbuf);
       }
       if (er == 0) size++;
     }
   
     rob = newObjectArray(size);
     size = 0;
     for (i=0; i<n; i++) {
       s = KopString(getoa(ostrArray,i));
       er=regexec(&preg,s,nmatch,pmatch,eflag);
       if ((er != 0) && (er != REG_NOMATCH)) {
         mbuf = (char *) sGC_malloc(mbufSize);
         if (mbuf == NULL) errorKan1("%s\n","No more memory.");
         regerror(er,&preg,mbuf,mbufSize-1);
         errorKan1("regcomp error: %s\n",mbuf);
       }
       if (er == 0) {
         ob = newObjectArray(3);
         putoa(ob,0,KpoString(s));
         /* temporary */
         putoa(ob,1,KpoInteger((int) (pmatch[0].rm_so)));
         putoa(ob,2,KpoInteger((int) (pmatch[0].rm_eo)));
         putoa(rob,size,ob);
         size++;
       }
     }
     regfree(&preg);
     return rob;
   }

Legend:
Removed from v.1.13  
changed lines
  Added in v.1.36

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