Annotation of OpenXM_contrib2/asir2000/builtin/file.c, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/builtin/file.c,v 1.2 1999/11/23 07:14:14 noro Exp $ */
2: #include "ca.h"
3: #include "parse.h"
4: #include "base.h"
5: #include "genpari.h"
6:
7: #if defined(VISUAL)
8: #include <windows.h>
9: /* #define ECGEN_KEYNAME "SoftWare\\Fujitsu\\WinECgen\\1.00.000" */
10: #define ECGEN_KEYNAME "SoftWare\\Fujitsu\\FSEcParamGen\\V1.0L10"
11: #define ASIR_KEYNAME "SoftWare\\Fujitsu\\Asir\\1999.03.31"
12: #endif
13:
14: void Pget_rootdir();
15: void Paccess(),Premove_file();
16: void Pbsave_enc(), Pbload_enc();
17:
18: void Pload(), Pwhich(), Ploadfiles(), Poutput();
19: void Pbsave(), Pbload(), Pbload27();
20: void Pbsave_compat(), Pbload_compat();
21: void Pbsave_cmo(), Pbload_cmo();
22:
23: extern int des_encryption;
24: extern char *asir_libdir;
25:
26: struct ftab file_tab[] = {
27: {"remove_file",Premove_file,1},
28: {"access",Paccess,1},
29: {"load",Pload,-1},
30: {"which",Pwhich,1},
31: {"loadfiles",Ploadfiles,1},
32: {"output",Poutput,-1},
33: {"bsave",Pbsave,2},
34: {"bload",Pbload,1},
35: {"get_rootdir",Pget_rootdir,0},
36: {"bsave_enc",Pbsave_enc,2},
37: {"bload_enc",Pbload_enc,1},
38: {"bload27",Pbload27,1},
39: {"bsave_compat",Pbsave_compat,2},
40: {"bload_compat",Pbload_compat,1},
41: {"bsave_cmo",Pbsave_cmo,2},
42: {"bload_cmo",Pbload_cmo,1},
43: {0,0,0},
44: };
45:
46: void Pload(arg,rp)
47: NODE arg;
48: Q *rp;
49: {
50: int ret = 0;
51: char *name,*name0;
52: char errbuf[BUFSIZ];
53:
54: #if defined THINK_C
55: if ( !arg ) {
56: ret = finder_loadfile();
57: } else
58: #endif
59: if ( ARG0(arg) ) {
60: switch (OID(ARG0(arg))) {
61: case O_STR:
62: name0 = BDY((STRING)ARG0(arg));
63: searchasirpath(name0,&name);
64: if ( !name ) {
65: sprintf(errbuf,"load : \"%s\" not found in the search path",name0);
66: error(errbuf);
67: }
68: ret = loadfile(name);
69: if ( !ret ) {
70: sprintf(errbuf,"load : \"%s\" could not be loaded",name);
71: error(errbuf);
72: }
73: break;
74: default:
75: error("load : invalid argument");
76: break;
77: }
78: }
79: STOQ(ret,*rp);
80: }
81:
82: void Pwhich(arg,rp)
83: NODE arg;
84: STRING *rp;
85: {
86: char *name;
87: STRING str;
88:
89: switch (OID(ARG0(arg))) {
90: case O_STR:
91: searchasirpath(BDY((STRING)ARG0(arg)),&name);
92: break;
93: default:
94: name = 0;
95: break;
96: }
97: if ( name ) {
98: MKSTR(str,name); *rp = str;
99: } else
100: *rp = 0;
101: }
102:
103: void Ploadfiles(arg,rp)
104: NODE arg;
105: Q *rp;
106: {
107: int ret;
108:
109: if ( ARG0(arg) )
110: if ( OID(ARG0(arg)) != O_LIST )
111: ret = 0;
112: else
113: ret = loadfiles(BDY((LIST)ARG0(arg)));
114: else
115: ret = 0;
116: STOQ(ret,*rp);
117: }
118:
119: void Poutput(arg,rp)
120: NODE arg;
121: Q *rp;
122: {
123: #if PARI
124: extern FILE *outfile;
125: #endif
126: FILE *fp;
127:
128: fflush(asir_out);
129: if ( asir_out != stdout )
130: fclose(asir_out);
131: switch ( argc(arg) ) {
132: case 0:
133: fp = stdout; break;
134: case 1:
135: asir_assert(ARG0(arg),O_STR,"output");
136: fp = fopen(((STRING)ARG0(arg))->body,"a+");
137: if ( !fp )
138: error("output : invalid filename");
139: break;
140: }
141: #if PARI
142: pari_outfile =
143: #endif
144: asir_out = fp;
145: *rp = ONE;
146: }
147:
148: extern int ox_file_io;
149:
150: void Pbsave(arg,rp)
151: NODE arg;
152: Q *rp;
153: {
154: FILE *fp;
155: VL vl,t;
156:
157: asir_assert(ARG1(arg),O_STR,"bsave");
158: get_vars_recursive(ARG0(arg),&vl);
159: for ( t = vl; t; t = NEXT(t) )
160: if ( t->v->attr == (pointer)V_UC )
161: error("bsave : not implemented");
162: #if defined(THINK_C) || defined(VISUAL)
163: fp = fopen(BDY((STRING)ARG1(arg)),"wb");
164: #else
165: fp = fopen(BDY((STRING)ARG1(arg)),"w");
166: #endif
167: if ( !fp )
168: error("bsave : invalid filename");
169: ox_file_io = 1; /* network byte order is used */
170: savevl(fp,vl);
171: saveobj(fp,ARG0(arg));
172: fclose(fp);
173: ox_file_io = 0;
174: *rp = ONE;
175: }
176:
177: void Pbload(arg,rp)
178: NODE arg;
179: Obj *rp;
180: {
181: FILE *fp;
182:
183: asir_assert(ARG0(arg),O_STR,"bload");
184: #if defined(THINK_C) || defined(VISUAL)
185: fp = fopen(BDY((STRING)ARG0(arg)),"rb");
186: #else
187: fp = fopen(BDY((STRING)ARG0(arg)),"r");
188: #endif
189: if ( !fp )
190: error("bload : invalid filename");
191: ox_file_io = 1; /* network byte order is used */
192: loadvl(fp);
193: loadobj(fp,rp);
194: fclose(fp);
195: ox_file_io = 0;
196: }
197:
198: void Pbsave_cmo(arg,rp)
199: NODE arg;
200: Q *rp;
201: {
202: FILE *fp;
203: VL vl,t;
204:
205: asir_assert(ARG1(arg),O_STR,"bsave_cmo");
206: #if defined(THINK_C) || defined(VISUAL)
207: fp = fopen(BDY((STRING)ARG1(arg)),"wb");
208: #else
209: fp = fopen(BDY((STRING)ARG1(arg)),"w");
210: #endif
211: if ( !fp )
212: error("bsave_cmo : invalid filename");
213: ox_file_io = 1; /* network byte order is used */
214: write_cmo(fp,ARG0(arg));
215: fclose(fp);
216: ox_file_io = 0;
217: *rp = ONE;
218: }
219:
220: void Pbload_cmo(arg,rp)
221: NODE arg;
222: Obj *rp;
223: {
224: FILE *fp;
225:
226: asir_assert(ARG0(arg),O_STR,"bload_cmo");
227: #if defined(THINK_C) || defined(VISUAL)
228: fp = fopen(BDY((STRING)ARG0(arg)),"rb");
229: #else
230: fp = fopen(BDY((STRING)ARG0(arg)),"r");
231: #endif
232: if ( !fp )
233: error("bload_cmo : invalid filename");
234: ox_file_io = 1; /* network byte order is used */
235: read_cmo(fp,rp);
236: fclose(fp);
237: ox_file_io = 0;
238: }
239:
240: #if defined(VISUAL)
241: void get_rootdir(name,len)
242: char *name;
243: int len;
244: {
245: LONG ret;
246: HKEY hOpenKey;
247: DWORD Type;
248:
249: name[0] = 0;
250: ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ECGEN_KEYNAME, 0,
251: KEY_QUERY_VALUE, &hOpenKey);
252: if ( ret != ERROR_SUCCESS )
253: ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ASIR_KEYNAME, 0,
254: KEY_QUERY_VALUE, &hOpenKey);
255: if( ret == ERROR_SUCCESS ) {
256: RegQueryValueEx(hOpenKey, "Directory", NULL, &Type, name, &len);
257: RegCloseKey(hOpenKey);
258: }
259: }
260: #else
261: void get_rootdir(name,len)
262: char *name;
263: int len;
264: {
265: strcpy(name,asir_libdir);
266: }
267: #endif
268:
269: void Pget_rootdir(rp)
270: STRING *rp;
271: {
272: static struct oSTRING rootdir;
273: static char DirName[BUFSIZ];
274: int DirNameLen;
275:
276: if ( !rootdir.body ) {
277: get_rootdir(DirName,sizeof(DirName));
278: rootdir.id = O_STR;
279: rootdir.body = DirName;
280: }
281: *rp = &rootdir;
282: }
283:
284: void Pbsave_enc(arg,rp)
285: NODE arg;
286: Obj *rp;
287: {
288: init_deskey();
289: des_encryption = 1;
290: Pbsave(arg,rp);
291: des_encryption = 0;
292: }
293:
294: void Pbload_enc(arg,rp)
295: NODE arg;
296: Obj *rp;
297: {
298: init_deskey();
299: des_encryption = 1;
300: Pbload(arg,rp);
301: des_encryption = 0;
302: }
303:
304: void Pbload27(arg,rp)
305: NODE arg;
306: Obj *rp;
307: {
308: FILE *fp;
309: Obj r;
310:
311: asir_assert(ARG0(arg),O_STR,"bload27");
312: #if defined(THINK_C) || defined(VISUAL)
313: fp = fopen(BDY((STRING)ARG0(arg)),"rb");
314: #else
315: fp = fopen(BDY((STRING)ARG0(arg)),"r");
316: #endif
317: if ( !fp )
318: error("bload : invalid filename");
319: loadvl(fp);
320: loadobj(fp,&r);
321: fclose(fp);
322: bobjtoobj(BASE27,r,rp);
323: }
324:
325: void Pbsave_compat(arg,rp)
326: NODE arg;
327: Q *rp;
328: {
329: FILE *fp;
330: VL vl,t;
331:
332: asir_assert(ARG1(arg),O_STR,"bsave_compat");
333: get_vars_recursive(ARG0(arg),&vl);
334: for ( t = vl; t; t = NEXT(t) )
335: if ( t->v->attr == (pointer)V_UC )
336: error("bsave : not implemented");
337: #if defined(THINK_C) || defined(VISUAL)
338: fp = fopen(BDY((STRING)ARG1(arg)),"wb");
339: #else
340: fp = fopen(BDY((STRING)ARG1(arg)),"w");
341: #endif
342: if ( !fp )
343: error("bsave : invalid filename");
344: /* indicator of an asir32 file */
345: putw(0,fp); putw(0,fp);
346: savevl(fp,vl);
347: saveobj(fp,ARG0(arg));
348: fclose(fp);
349: *rp = ONE;
350: }
351:
352: void Pbload_compat(arg,rp)
353: NODE arg;
354: Obj *rp;
355: {
356: FILE *fp;
357: unsigned int hdr[2];
358: Obj r;
359: int c;
360:
361: asir_assert(ARG0(arg),O_STR,"bload_compat");
362: #if defined(THINK_C) || defined(VISUAL)
363: fp = fopen(BDY((STRING)ARG0(arg)),"rb");
364: #else
365: fp = fopen(BDY((STRING)ARG0(arg)),"r");
366: #endif
367: if ( !fp )
368: error("bload : invalid filename");
369: fread(hdr,sizeof(unsigned int),2,fp);
370: if ( !hdr[0] && !hdr[1] ) {
371: /* asir32 file or asir27 0 */
372: c = fgetc(fp);
373: if ( c == EOF ) {
374: /* asir27 0 */
375: *rp = 0;
376: } else {
377: /* asir32 file */
378: ungetc(c,fp);
379: loadvl(fp);
380: loadobj(fp,rp);
381: }
382: } else {
383: /* asir27 file */
384: rewind(fp);
385: loadvl(fp);
386: loadobj(fp,&r);
387: bobjtoobj(BASE27,r,rp);
388: }
389: fclose(fp);
390: }
391:
392: void Premove_file(arg,rp)
393: NODE arg;
394: Q *rp;
395: {
396: unlink((char *)BDY((STRING)ARG0(arg)));
397: *rp = ONE;
398: }
399:
400: void Paccess(arg,rp)
401: NODE arg;
402: Q *rp;
403: {
404: char *name;
405: STRING str;
406:
407: #if defined(VISUAL)
408: if ( access(BDY((STRING)ARG0(arg)),04) >= 0 )
409: #else
410: if ( access(BDY((STRING)ARG0(arg)),R_OK) >= 0 )
411: #endif
412: *rp = ONE;
413: else
414: *rp = 0;
415: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>