===================================================================
RCS file: /home/cvs/OpenXM_contrib2/asir2000/parse/load.c,v
retrieving revision 1.3
retrieving revision 1.19
diff -u -p -r1.3 -r1.19
--- OpenXM_contrib2/asir2000/parse/load.c	2000/08/21 08:31:47	1.3
+++ OpenXM_contrib2/asir2000/parse/load.c	2006/02/05 08:28:04	1.19
@@ -23,7 +23,7 @@
  * shall be made on your publication or presentation in any form of the
  * results obtained by use of the SOFTWARE.
  * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
- * e-mail at risa-admin@flab.fujitsu.co.jp of the detailed specification
+ * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
  * for such modification or the source code of the modified part of the
  * SOFTWARE.
  * 
@@ -45,25 +45,16 @@
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  *
- * $OpenXM: OpenXM_contrib2/asir2000/parse/load.c,v 1.2 2000/01/19 05:05:04 noro Exp $ 
+ * $OpenXM: OpenXM_contrib2/asir2000/parse/load.c,v 1.18 2005/03/28 09:20:38 noro Exp $ 
 */
 #include "ca.h"
 #include "parse.h"
-#if defined(THINK_C)
-#include <string.h>
-#include        <StandardFile.h>
-#include        <Windows.h>
-#include        <OSUtils.h>
-#include        <ToolUtils.h>
-#else
+
 #if defined(VISUAL)
 #include <string.h>
 #include <fcntl.h>
-#if defined(GO32)
-#include <unistd.h>
-#endif
 #include <sys/stat.h>
-#else
+#else /* VISUAL */
 #if defined(_PA_RISC1_1) || defined(SYSV) || defined(__SVR4)
 #include <unistd.h>
 #include <string.h>
@@ -74,7 +65,6 @@
 #include <sys/file.h>
 #include <sys/stat.h>
 #endif
-#endif
 
 #if defined(linux)
 #include <unistd.h>
@@ -84,49 +74,13 @@
 #include <io.h>
 #endif
 
+#ifdef MALLOC
 #undef MALLOC
 #define MALLOC(x) GC_malloc((x)+4)
-
-char *ASIRLOADPATH[32];
-
-void encrypt_file(char *,char *);
-void decrypt_file(char *,char *);
-
-#if defined(THINK_C)
-void searchasirpath(char *,char **);
-void loadasirfile(char *);
-
-short initvol;
-
-void initVol();
-short getVol();
-void setDir(short);
-void resetDir();
-
-void initVol() {
-	char buf[BUFSIZ];
-	
-	GetVol((StringPtr)buf,&initvol);
-}
-
-short getVol() {
-	short vol;
-	char buf[BUFSIZ];
-	
-	GetVol((StringPtr)buf,&vol);
-	return vol;
-}
-
-void setDir(short vol)
-{
-	SetVol(0,vol);
-}
-
-void resetDir() {
-	SetVol(0,initvol);
-}
 #endif
 
+char **ASIRLOADPATH;
+
 #if defined(VISUAL)
 #define ENVDELIM ';'
 #define MORE "more < "
@@ -136,18 +90,57 @@ void resetDir() {
 #endif
 
 #ifndef ASIR_LIBDIR
-#define ASIR_LIBDIR "."
+#define ASIR_LIBDIR "/usr/local/lib/asir"
 #endif
+#ifndef ASIR_CONTRIB_DIR
+#define ASIR_CONTRIB_DIR "/usr/local/lib/asir-contrib"
+#endif
 
 char *getenv();
+void Pget_rootdir();
+char *search_executable(char *name);
+
 extern char *asir_libdir;
+extern char *asir_contrib_dir;
 extern char *asir_pager;
 extern int read_exec_file;
 extern int main_parser;
+extern JMP_BUF exec_env;
 
+char *search_executable(char *name)
+{
+	char *c,*s,*ret;
+	int len,nlen;
+	char dir[BUFSIZ],path[BUFSIZ];
+	struct stat buf;
+
+	nlen = strlen(name);
+	for ( s = (char *)getenv("PATH"); s; ) {
+		c = (char *)index(s,':');
+		len = c ? c-s : strlen(s);
+		if ( len >= BUFSIZ ) continue;
+		strncpy(dir,s,len); dir[len] = 0;
+		if ( c ) s = c+1;
+		else s = 0;
+		if ( len+nlen+1 >= BUFSIZ ) continue;
+		sprintf(path,"%s/%s",dir,name);
+		if ( !stat(path,&buf) && !(buf.st_mode & S_IFDIR) 
+#if !defined(VISUAL)
+			&& !access(path,X_OK)
+#endif
+                ) {
+			len = strlen(path)+1;
+			ret = (char *)MALLOC(len);
+			strcpy(ret,path);
+			return ret;
+		}
+	}
+	return 0;
+}
+
 void env_init() {
 	char *e,*p,*q;
-	int i,l;
+	int i,l,japanese;
 	char *getenv();
 	char *oxhome;
 	char rootname[BUFSIZ];
@@ -167,13 +160,53 @@ void env_init() {
 #endif
 		}
 	}
+
+	if ( !(asir_contrib_dir = getenv("ASIR_CONTRIB_DIR")) ) {
+		if ( oxhome = getenv("OpenXM_HOME") ) {
+			asir_contrib_dir = (char *)malloc(strlen(oxhome)+strlen("/lib/asir-contrib")+1);
+			sprintf(asir_contrib_dir,"%s/lib/asir-contrib",oxhome);
+		} else {
+#if defined(VISUAL)
+			get_rootdir(rootname,sizeof(rootname));
+			asir_contrib_dir = (char *)malloc(strlen(rootname)+strlen("/lib-asir-contrib")+1);
+			sprintf(asir_contrib_dir,"%s/lib-asir-contrib",rootname);
+#else
+			asir_contrib_dir = (char *)malloc(strlen(ASIR_CONTRIB_DIR)+1);
+			strcpy(asir_contrib_dir,ASIR_CONTRIB_DIR);
+#endif
+		}
+	}
+
 	if ( !(asir_pager = getenv("PAGER")) ) {
-		asir_pager = (char *)malloc(strlen(MORE)+1);
-		strcpy(asir_pager,MORE);
+		japanese = 0;
+		if ( (e = getenv("LANGUAGE")) && 
+			(!strncmp(e,"japan",5) || !strncmp(e,"ja_JP",5)) ) japanese = 1;
+		else if ( (e = getenv("LC_ALL")) && 
+			(!strncmp(e,"japan",5) || !strncmp(e,"ja_JP",5)) ) japanese = 1;
+		else if ( (e = getenv("LC_CTYPE")) && 
+			(!strncmp(e,"japan",5) || !strncmp(e,"ja_JP",5)) ) japanese = 1;
+		else if ( (e = getenv("LANG")) && 
+			(!strncmp(e,"japan",5) || !strncmp(e,"ja_JP",5)) ) japanese = 1;
+		if ( japanese )
+			asir_pager = search_executable("jless");
+		if ( !asir_pager ) {
+			/* default: more */
+			asir_pager = (char *)malloc(strlen(MORE)+1);
+			strcpy(asir_pager,MORE);
+		}
 	}
-	if ( e = getenv("ASIRLOADPATH" ) )
+	if ( e = getenv("ASIRLOADPATH" ) ) {
 		for ( i = 0; ; i++, e = p+1 ) {
 			p = (char *)index(e,ENVDELIM);
+			if ( !p )
+				break;
+		}
+		i += 4;
+        ASIRLOADPATH=(char **)MALLOC(sizeof(char *)*i);
+		for ( l = 0; l<i; l++) ASIRLOADPATH[l] = NULL; 
+		e = getenv("ASIRLOADPATH");
+		for ( i = 0; ; i++, e = p+1 ) {
+			p = (char *)index(e,ENVDELIM);
 			l = p ? p-e : strlen(e); q = (char *)MALLOC(l+1);
 			if ( l ) {
 				strncpy(q,e,l); q[l] = 0; ASIRLOADPATH[i] = q;
@@ -181,18 +214,23 @@ void env_init() {
 			if ( !p )
 				break;
 		}
+    }else{
+	  ASIRLOADPATH=(char **)MALLOC(sizeof(char *)*3);
+	  ASIRLOADPATH[0] = NULL;
+	}
+
 	for ( i = 0; ASIRLOADPATH[i]; i++ );
-	ASIRLOADPATH[i] = asir_libdir;
+	if (asir_contrib_dir) ASIRLOADPATH[i++] = asir_contrib_dir;
+	if (asir_libdir) ASIRLOADPATH[i++] = asir_libdir;
+	ASIRLOADPATH[i] = NULL;
 }
 
-void searchasirpath(name,pathp)
-char *name;
-char **pathp;
+void searchasirpath(char *name,char **pathp)
 {
 	char **p;
 	char *q;
 	int l;
-#if !defined(THINK_C) && !defined(VISUAL)
+#if !defined(VISUAL)
 	struct stat sbuf;
 	
 	if ( (name[0] == '/') || ( name[0] == '.') || strchr(name,':')
@@ -219,7 +257,7 @@ char **pathp;
 		}
 		*pathp = 0;
 	}
-#elif defined(VISUAL)
+#else
 	if ( (name[0] == '/') || ( name[0] == '.') || strchr(name,':')
 		|| !ASIRLOADPATH[0] )
 		*pathp = name;
@@ -234,91 +272,87 @@ char **pathp;
 		}
 		*pathp = 0;
 	}
-#else
-	if ( (name[0] == '/') || ( name[0] == '.') || !ASIRLOADPATH[0] )
-		*pathp = name;
-	else {
-		for ( p = ASIRLOADPATH; *p; p++ ) {
-			l = strlen(*p)+strlen(name)+2;
-			q = (char *)ALLOCA(l); sprintf(q,"%s/%s",*p,name);
-			*pathp = (char *)MALLOC(l); strcpy(*pathp,q);
-			return;
-		}
-		*pathp = 0;
-	}
 #endif
 }
 
-#if defined(THINK_C)
-#define DELIM ':'
-#elif defined(VISUAL)
 #define DELIM '/'
-#endif
 
-void Eungetc(int,FILE *);
-
-void loadasirfile(name0)
-char *name0;
+void loadasirfile(char *name0)
 {
 	FILE *in;
-	IN t;
+	INFILE t;
 	extern char cppname[];
-#if defined(THINK_C) || defined(VISUAL)
-	char tname[BUFSIZ],dname[BUFSIZ],ibuf1[BUFSIZ],ibuf2[BUFSIZ];
+#if defined(VISUAL)
+	char ibuf1[BUFSIZ],ibuf2[BUFSIZ];
 	int ac;
-#if defined(__MWERKS__)
-	char *av[64];
-#else
 	char *av[BUFSIZ];
-#endif
-	char *p,*c;
+	char *p;
 	FILE *fp;
-	char name[BUFSIZ],tname0[BUFSIZ];
+	char dname[BUFSIZ],tname0[BUFSIZ];
+	char *name,*tname;
 	int encoded;
+	static char prefix[BUFSIZ];
+	int process_id();
+	char CppExe[BUFSIZ];
+	char nbuf[BUFSIZ],tnbuf[BUFSIZ];
+	STRING rootdir;
+	void call_exe(char *,char **);
 
-#if defined(VISUAL)
+	/* create the unique prefix */
+	if ( !prefix[0] )
+		sprintf(prefix,"asir%d",process_id());
+
 	fp = fopen(name0,"rb");
 	if ( getc(fp) == 0xff ) {
 		/* encoded file */
 		fclose(fp);
-		sprintf(name,"%s.$$$",name0);	
+		name = tempnam(NULL,prefix);
 		decrypt_file(name0,name);
+		/* the file 'name' created */
 		encoded = 1;
 	} else {
 		fclose(fp);
-		strcpy(name,name0);
+		name = name0;
 		encoded = 0;
 	}
-#else
-	strcpy(name,name0);
-#endif
 
 	strcpy(dname,name);
+	av[0] = "cpp";
+	sprintf(nbuf,"\"%s\"",name);
+	av[1] = nbuf; 
+	tname = tempnam(NULL,prefix);
+	sprintf(tnbuf,"\"%s\"",tname);
+	av[2] = tnbuf;
+	sprintf(ibuf1,"-I\"%s\"",asir_libdir);
+	av[3] = ibuf1;
+	av[4] = "-DWINDOWS";
+
+	/* set the include directory */
 	p = strrchr(dname,DELIM);
-	av[0] = "cpp"; av[1] = name; av[2] = tname;
-	sprintf(ibuf1,"-I%s",asir_libdir); av[3] = ibuf1; av[4] = "-DWINDOWS";
 	if ( !p ) {
-		sprintf(tname,"%s.___",name); av[5] = 0; ac = 5;
+		av[5] = 0; ac = 5;
 	} else {
-		*p++ = 0;
-#if defined(VISUAL)
-		if ( c = strchr(dname,':') ) {
-			*c = 0;
-			sprintf(tname,"%s:%s%c%s.___",dname,c+1,DELIM,p);
-			*c = ':';
-		} else
-			
-#endif
-		sprintf(tname,"%s%c%s.___",dname,DELIM,p);
-		sprintf(ibuf2,"-I%s",dname); av[5] = ibuf2; av[6] = 0; ac = 6;
+		*p = 0;
+		sprintf(ibuf2,"-I\"%s\"",dname);
+		av[5] = ibuf2;
+		av[6] = 0; ac = 6;
 	}
-	cpp_main(ac,av);
+//	cpp_main(ac,av);
+	Pget_rootdir(&rootdir);
+	sprintf(CppExe,"%s\\bin\\cpp.exe",BDY(rootdir));
+	call_exe(CppExe,av);
+			
+	/* the file tname created */
 	if ( encoded ) {
-		unlink(name);
-		strcpy(tname0,tname);
-		sprintf(tname,"%s.###",tname0);
+		unlink(name); free(name);
+
+		strcpy(tname0,tname); free(tname);
+		tname = tempnam(NULL,prefix);
+
 		encrypt_file(tname0,tname);
+		/* the file tname created */
 		unlink(tname0);
+
 		in = fopen(tname,"rb");
 	} else
 		in = fopen(tname,"r");
@@ -326,13 +360,10 @@ char *name0;
 		perror("fopen");
 		error("load : failed");
 	}
-	t = (IN)MALLOC(sizeof(struct oIN));
-	t->name = (char *)MALLOC(strlen(name)+1); strcpy(t->name,name);
-	t->tname = (char *)MALLOC(strlen(tname)+1); strcpy(t->tname,tname);
+	t = (INFILE)MALLOC(sizeof(struct oINFILE));
+	t->name = (char *)MALLOC(strlen(name0)+1); strcpy(t->name,name0);
+	t->tname = (char *)MALLOC(strlen(tname)+1); strcpy(t->tname,tname); free(tname);
 	t->encoded = encoded;
-#if defined(THINK_C)
-	t->vol = getVol(); 
-#endif
 #else
 	char com[BUFSIZ];
 
@@ -341,7 +372,7 @@ char *name0;
 		perror("popen");
 		error("load : failed");
 	}
-	t = (IN)MALLOC(sizeof(struct oIN));
+	t = (INFILE)MALLOC(sizeof(struct oINFILE));
 	t->name = (char *)MALLOC(strlen(name0)+1); strcpy(t->name,name0);
 #endif
 	t->fp = in; t->ln = 1; t->next = asir_infile; asir_infile = t;
@@ -351,8 +382,7 @@ char *name0;
 		reallocarray((char **)&EPVS->va,(int *)&EPVS->asize,(int *)&EPVS->n,(int)sizeof(struct oPV));
 }
 
-void execasirfile(name)
-char *name;
+void execasirfile(char *name)
 {
 	loadasirfile(name);
 	read_exec_file = 1;
@@ -360,10 +390,32 @@ char *name;
 	read_exec_file = 0;
 }
 
+void load_and_execfile(char *name)
+{
+	FILE *fp;
+	INFILE save_asir_infile;
+	int save_prresult;
+	extern prresult;
+
+	savepvs();
+	save_asir_infile = asir_infile;
+	save_prresult = prresult;
+	asir_infile = 0;
+	loadasirfile(name);
+	if ( !SETJMP(exec_env) ) {
+		/* XXX : information for asir_teriminate() */
+		read_exec_file = 2;
+		read_eval_loop();
+		read_exec_file = 0;
+	}
+	restorepvs();
+	asir_infile = save_asir_infile;
+	prresult = save_prresult;
+}
+
 static NODE objfile = 0;
 
-int loadfile(s)
-char *s;
+int loadfile(char *s)
 {
 	FILE *in;
 
@@ -375,7 +427,7 @@ char *s;
 		return 0;
 }
 
-int loadfiles(node) NODE node; { return 0; }
+int loadfiles(NODE node) { return 0; }
 
 static unsigned char encrypt_tab[128][2] = {
 {137,40},{1,194},{133,79},{48,20},{254,76},{98,17},{110,233},{19,231},
@@ -425,8 +477,7 @@ unsigned char decrypt_char(unsigned char c)
 	return decrypt_tab[c];
 }
 
-void encrypt_file(in,out)
-char *in,*out;
+void encrypt_file(char *in,char *out)
 {
 	FILE *infp,*outfp;
 	int c;
@@ -437,13 +488,12 @@ char *in,*out;
 		c = getc(infp);
 		if ( c == EOF )
 			break;
-		putc(encrypt_char(c),outfp);
+		putc(encrypt_char((unsigned char)c),outfp);
 	}
 	fclose(infp); fclose(outfp);
 }
 
-void decrypt_file(in,out)
-char *in,*out;
+void decrypt_file(char *in,char *out)
 {
 	FILE *infp,*outfp;
 	int c;
@@ -456,7 +506,7 @@ char *in,*out;
 		c = getc(infp);
 		if ( c == EOF )
 			break;
-		putc(decrypt_char(c),outfp);
+		putc(decrypt_char((unsigned char)c),outfp);
 	}
 	fclose(infp); fclose(outfp);
 }