Annotation of OpenXM_contrib2/asir2000/io/io.c, Revision 1.25
1.4 noro 1: /*
2: * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
3: * All rights reserved.
4: *
5: * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
6: * non-exclusive and royalty-free license to use, copy, modify and
7: * redistribute, solely for non-commercial and non-profit purposes, the
8: * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
9: * conditions of this Agreement. For the avoidance of doubt, you acquire
10: * only a limited right to use the SOFTWARE hereunder, and FLL or any
11: * third party developer retains all rights, including but not limited to
12: * copyrights, in and to the SOFTWARE.
13: *
14: * (1) FLL does not grant you a license in any way for commercial
15: * purposes. You may use the SOFTWARE only for non-commercial and
16: * non-profit purposes only, such as academic, research and internal
17: * business use.
18: * (2) The SOFTWARE is protected by the Copyright Law of Japan and
19: * international copyright treaties. If you make copies of the SOFTWARE,
20: * with or without modification, as permitted hereunder, you shall affix
21: * to all such copies of the SOFTWARE the above copyright notice.
22: * (3) An explicit reference to this SOFTWARE and its copyright owner
23: * shall be made on your publication or presentation in any form of the
24: * results obtained by use of the SOFTWARE.
25: * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
1.5 noro 26: * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
1.4 noro 27: * for such modification or the source code of the modified part of the
28: * SOFTWARE.
29: *
30: * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
31: * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
32: * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
33: * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
34: * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
35: * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
36: * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
37: * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
38: * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
39: * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
40: * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
41: * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
42: * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
43: * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
44: * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
45: * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
46: * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
1.25 ! noro 47: * $OpenXM: OpenXM_contrib2/asir2000/io/io.c,v 1.24 2018/09/09 08:13:42 ohara Exp $
1.4 noro 48: */
1.1 noro 49: #include <stdio.h>
50: #include "ca.h"
1.9 noro 51: #include "parse.h"
1.25 ! noro 52: #include "ox.h"
1.19 fujimoto 53: #if defined(VISUAL) || defined(__MINGW32__) || defined(MPI)
1.1 noro 54: #include "wsio.h"
55: #endif
56:
1.3 noro 57: extern int little_endian,lib_ox_need_conv;
1.1 noro 58: extern int ox_do_copy, ox_do_count, ox_count_length, ox_file_io, ox_need_conv;
59: extern char *ox_copy_bptr;
1.21 noro 60: extern int ox_get_pari_result;
1.1 noro 61:
1.25 ! noro 62: void reset_ox_pari();
1.9 noro 63:
1.1 noro 64: void reset_io()
65: {
1.23 noro 66: ox_file_io = 0;
67: if ( ox_get_pari_result ) reset_ox_pari();
1.1 noro 68: }
69:
70: void endian_init()
71: {
1.23 noro 72: unsigned int et = 0xff;
1.1 noro 73:
1.23 noro 74: if ( *((char *)&et) )
75: little_endian = 1;
76: else
77: little_endian = 0;
78: ox_need_conv = 1;
1.1 noro 79: }
80:
1.9 noro 81: int countobj(Obj p)
1.1 noro 82: {
1.23 noro 83: ox_count_length = 0;
84: ox_do_count = 1; saveobj(0,p); ox_do_count = 0;
85: return ox_count_length;
1.1 noro 86: }
87:
1.9 noro 88: int count_as_cmo(Obj p)
1.2 noro 89: {
1.23 noro 90: ox_count_length = 0;
91: ox_do_count = 1; write_cmo(0,p); ox_do_count = 0;
92: return ox_count_length;
1.2 noro 93: }
94:
1.9 noro 95: int countvl(VL vl)
1.1 noro 96: {
1.23 noro 97: ox_count_length = 0;
98: ox_do_count = 1; savevl(0,vl); ox_do_count = 0;
99: return ox_count_length;
1.1 noro 100: }
101:
1.9 noro 102: void ox_copy_init(char *s)
1.1 noro 103: {
1.23 noro 104: ox_copy_bptr = s;
1.1 noro 105: }
106:
1.19 fujimoto 107: #if !defined(VISUAL) && !defined(__MINGW32__)
1.3 noro 108: /*
109: * library mode functions
110: * byte order is controlled by lib_ox_need_conv.
111: */
1.1 noro 112:
1.9 noro 113: void ox_obj_to_buf_as_cmo(Obj p)
1.2 noro 114: {
1.23 noro 115: ox_need_conv = lib_ox_need_conv;
116: ox_do_copy = 1; write_cmo(0,p); ox_do_copy = 0;
1.2 noro 117: }
118:
1.9 noro 119: void ox_buf_to_obj_as_cmo(Obj *p)
1.2 noro 120: {
1.23 noro 121: ox_need_conv = lib_ox_need_conv;
122: ox_do_copy = 1; read_cmo(0,p); ox_do_copy = 0;
1.2 noro 123: }
124:
1.9 noro 125: void ox_vl_to_buf(VL vl)
1.1 noro 126: {
1.23 noro 127: ox_do_copy = 1; savevl(0,vl); ox_do_copy = 0;
1.1 noro 128: }
1.8 noro 129: #endif
1.1 noro 130:
1.9 noro 131: int gen_fread (char *ptr,int size,int nitems,FILE *stream)
1.1 noro 132: {
1.23 noro 133: int n;
1.1 noro 134:
1.23 noro 135: if ( ox_do_copy ) {
136: n = size*nitems;
137: memcpy(ptr,ox_copy_bptr,n);
138: ox_copy_bptr += n;
139: /* dummy return */
140: return 0;
141: } else {
1.19 fujimoto 142: #if defined(VISUAL) || defined(__MINGW32__)
1.24 ohara 143: if ( WSIO_fileno((STREAM *)stream) < 0 )
1.23 noro 144: n = cread(ptr,size,nitems,(STREAM *)stream);
145: else
1.12 noro 146: #elif defined(MPI)
1.23 noro 147: if ( (char)fileno(stream) < 0 )
148: n = cread(ptr,size,nitems,(STREAM *)stream);
149: else
150: #endif
151: n = fread(ptr,size,nitems,stream);
152: if ( !n ) {
153: ExitAsir();
154: /* NOTREACHED */
155: return 0;
156: } else
157: return n;
158: }
1.1 noro 159: }
160:
1.9 noro 161: int gen_fwrite (char *ptr,int size,int nitems,FILE *stream)
1.1 noro 162: {
1.23 noro 163: int n;
1.1 noro 164:
1.23 noro 165: if ( ox_do_count ) {
166: ox_count_length += size*nitems;
167: /* dummy return */
168: return 0;
169: } else if ( ox_do_copy ) {
170: n = size*nitems;
171: memcpy(ox_copy_bptr,ptr,n);
172: ox_copy_bptr += n;
173: /* dummy return */
174: return 0;
175: } else
1.19 fujimoto 176: #if defined(VISUAL) || defined(__MINGW32__)
1.24 ohara 177: if ( WSIO_fileno((STREAM *)stream) < 0 )
1.23 noro 178: return cwrite(ptr,size,nitems,(STREAM *)stream);
179: else
1.12 noro 180: #elif defined(MPI)
1.23 noro 181: if ( (char)fileno(stream) < 0 )
182: return cwrite(ptr,size,nitems,(STREAM *)stream);
183: else
1.1 noro 184: #endif
1.23 noro 185: return fwrite(ptr,size,nitems,stream);
1.1 noro 186: }
187:
1.9 noro 188: void write_char(FILE *f,unsigned char *p)
1.1 noro 189: {
1.23 noro 190: gen_fwrite(p,sizeof(unsigned char),1,f);
1.1 noro 191: }
192:
1.9 noro 193: void write_short(FILE *f,unsigned short *p)
1.1 noro 194: {
1.23 noro 195: unsigned short t;
1.1 noro 196:
1.23 noro 197: if ( little_endian && (ox_file_io || ox_need_conv) ) {
198: t = htons(*p);
199: gen_fwrite((char *)&t,sizeof(unsigned short),1,f);
200: } else
201: gen_fwrite((char *)p,sizeof(unsigned short),1,f);
1.1 noro 202: }
203:
1.9 noro 204: void write_int(FILE *f,unsigned int *p)
1.1 noro 205: {
1.23 noro 206: unsigned int t;
1.1 noro 207:
1.23 noro 208: if ( little_endian && (ox_file_io || ox_need_conv) ) {
209: t = htonl(*p);
210: gen_fwrite((char *)&t,sizeof(unsigned int),1,f);
211: } else
212: gen_fwrite((char *)p,sizeof(unsigned int),1,f);
1.1 noro 213: }
214:
1.15 noro 215: void write_int64(FILE *f,UL *p)
216: {
217: unsigned int t;
218:
1.23 noro 219: if ( little_endian && (ox_file_io || ox_need_conv) ) {
220: t = htonl(((unsigned int *)p)[1]);
221: gen_fwrite((char *)&t,sizeof(unsigned int),1,f);
222: t = htonl(((unsigned int *)p)[0]);
223: gen_fwrite((char *)&t,sizeof(unsigned int),1,f);
224: } else
225: gen_fwrite((char *)p,sizeof(UL),1,f);
1.15 noro 226: }
227:
1.13 ohara 228: #if defined(DES_ENC)
1.1 noro 229: int des_encryption;
230: static unsigned char asir_deskey[8] = {0xc7,0xe0,0xfc,0xb5,0xc3,0xad,0x8e,0x3a};
231: static unsigned char deskey_string[96];
232:
233: void init_deskey()
234: {
1.23 noro 235: static int deskey_initialized = 0;
1.1 noro 236:
1.23 noro 237: if ( !deskey_initialized ) {
238: key_schedule(asir_deskey,deskey_string);
239: deskey_initialized = 1;
240: }
1.1 noro 241: }
1.7 noro 242: #endif
1.1 noro 243:
1.9 noro 244: void write_intarray(FILE *f,unsigned int *p,int l)
1.1 noro 245: {
1.23 noro 246: int i;
247: unsigned int t;
1.13 ohara 248: #if defined(DES_ENC)
1.23 noro 249: int l2;
250: unsigned int plain[2],encrypted[2];
1.1 noro 251:
1.23 noro 252: if ( des_encryption ) {
253: l2 = l>>1;
254: for ( i = 0; i < l2; i++ ) {
255: plain[0] = *p++;
256: plain[1] = *p++;
257: des_enc(plain,deskey_string,encrypted);
258: encrypted[0] = htonl(encrypted[0]);
259: encrypted[1] = htonl(encrypted[1]);
260: gen_fwrite((char *)encrypted,sizeof(unsigned int),2,f);
261: }
262: if ( (l2<<1) < l ) {
263: plain[0] = *p;
264: plain[1] = 0;
265: des_enc(plain,deskey_string,encrypted);
266: encrypted[0] = htonl(encrypted[0]);
267: encrypted[1] = htonl(encrypted[1]);
268: gen_fwrite((char *)encrypted,sizeof(unsigned int),2,f);
269: }
270: } else
271: #endif
272: if ( little_endian && (ox_file_io || ox_need_conv) )
273: for ( i = 0; i < l; i++, p++) {
274: t = htonl(*p);
275: gen_fwrite((char *)&t,sizeof(unsigned int),1,f);
276: }
277: else
278: gen_fwrite((char *)p,sizeof(unsigned int),l,f);
1.1 noro 279: }
280:
1.14 ohara 281: #if SIZEOF_LONG == 8
1.18 noro 282: /* write l word (1word=4bytes) */
283: /* l even : low 32of p[0] | high32 of p[0] | ... */
284: /* l odd : high32 of p[0] | ... */
1.9 noro 285: void write_longarray(FILE *f,unsigned long *p,int l)
1.1 noro 286: {
1.18 noro 287: int i;
288: unsigned long w;
289: unsigned int hi,lo;
290:
291: if ( l%2 ) {
292: w = p[0]; hi = w>>32;
1.23 noro 293: if ( little_endian && (ox_file_io || ox_need_conv) )
1.20 noro 294: hi = htonl(hi);
1.18 noro 295: gen_fwrite((char *)&hi,sizeof(unsigned int),1,f);
296: i = 1;
297: } else
298: i = 0;
299: l = (l+1)/2;
300: for ( ; i < l; i++ ) {
301: w = p[i]; hi = w>>32; lo = w&0xffffffff;
1.23 noro 302: if ( little_endian && (ox_file_io || ox_need_conv) ) {
1.20 noro 303: hi = htonl(hi); lo = htonl(lo);
1.23 noro 304: }
1.18 noro 305: gen_fwrite((char *)&lo,sizeof(unsigned int),1,f);
306: gen_fwrite((char *)&hi,sizeof(unsigned int),1,f);
307: }
1.1 noro 308: }
309: #endif
310:
1.22 noro 311: #if defined(_WIN64)
312: /* write l word (1word=4bytes) */
313: /* l even : low 32of p[0] | high32 of p[0] | ... */
314: /* l odd : high32 of p[0] | ... */
315: void write_longarray(FILE *f,unsigned long long *p,int l)
316: {
317: int i;
318: unsigned long long w;
319: unsigned int hi,lo;
320:
321: if ( l%2 ) {
322: w = p[0]; hi = w>>32;
1.23 noro 323: if ( little_endian && (ox_file_io || ox_need_conv) )
1.22 noro 324: hi = htonl(hi);
325: gen_fwrite((char *)&hi,sizeof(unsigned int),1,f);
326: i = 1;
327: } else
328: i = 0;
329: l = (l+1)/2;
330: for ( ; i < l; i++ ) {
331: w = p[i]; hi = w>>32; lo = w&0xffffffff;
1.23 noro 332: if ( little_endian && (ox_file_io || ox_need_conv) ) {
1.22 noro 333: hi = htonl(hi); lo = htonl(lo);
1.23 noro 334: }
1.22 noro 335: gen_fwrite((char *)&lo,sizeof(unsigned int),1,f);
336: gen_fwrite((char *)&hi,sizeof(unsigned int),1,f);
337: }
338: }
339: #endif
340:
1.9 noro 341: void write_double(FILE *f,double *p)
1.1 noro 342: {
1.23 noro 343: unsigned int t;
1.1 noro 344:
1.23 noro 345: if ( little_endian && (ox_file_io || ox_need_conv) ) {
346: t = htonl(((unsigned int *)p)[1]);
347: gen_fwrite((char *)&t,sizeof(unsigned int),1,f);
348: t = htonl(((unsigned int *)p)[0]);
349: gen_fwrite((char *)&t,sizeof(unsigned int),1,f);
350: } else
351: gen_fwrite((char *)p,sizeof(double),1,f);
1.1 noro 352: }
353:
1.9 noro 354: void write_string(FILE *f,unsigned char *p,int l)
1.1 noro 355: {
1.23 noro 356: gen_fwrite(p,sizeof(unsigned char),l,f);
1.1 noro 357: }
358:
1.9 noro 359: void read_char(FILE *f,unsigned char *p)
1.1 noro 360: {
1.23 noro 361: gen_fread((char *)p,sizeof(unsigned char),1,f);
1.1 noro 362: }
363:
1.9 noro 364: void read_short(FILE *f,unsigned short *p)
1.1 noro 365: {
1.23 noro 366: gen_fread((char *)p,sizeof(unsigned short),1,f);
367: if ( little_endian && (ox_file_io || ox_need_conv) )
368: *p = ntohs(*p);
1.1 noro 369: }
370:
1.9 noro 371: void read_int(FILE *f,unsigned int *p)
1.1 noro 372: {
1.23 noro 373: gen_fread((char *)p,sizeof(unsigned int),1,f);
374: if ( little_endian && (ox_file_io || ox_need_conv) )
375: *p = ntohl(*p);
1.1 noro 376: }
377:
1.15 noro 378: void read_int64(FILE *f,UL *p)
379: {
1.23 noro 380: unsigned int t;
1.15 noro 381:
1.23 noro 382: if ( little_endian && (ox_file_io || ox_need_conv) ) {
383: gen_fread((char *)&t,sizeof(unsigned int),1,f);
384: ((unsigned int *)p)[1] = ntohl(t);
385: gen_fread((char *)&t,sizeof(unsigned int),1,f);
386: ((unsigned int *)p)[0] = ntohl(t);
387: } else
388: gen_fread((char *)p,sizeof(UL),1,f);
1.15 noro 389: }
390:
1.9 noro 391: void read_intarray(FILE *f,unsigned int *p,int l)
1.1 noro 392: {
1.23 noro 393: int i;
1.13 ohara 394: #if defined(DES_ENC)
1.23 noro 395: int l2;
396: unsigned int plain[2],encrypted[2];
1.1 noro 397:
1.23 noro 398: if ( des_encryption ) {
399: l2 = l>>1;
400: for ( i = 0; i < l2; i++ ) {
401: gen_fread((char *)encrypted,sizeof(unsigned int),2,f);
402: encrypted[0] = ntohl(encrypted[0]);
403: encrypted[1] = ntohl(encrypted[1]);
404: des_dec(encrypted,deskey_string,plain);
405: *p++ = plain[0];
406: *p++ = plain[1];
407: }
408: if ( (l2<<1) < l ) {
409: gen_fread((char *)encrypted,sizeof(unsigned int),2,f);
410: encrypted[0] = ntohl(encrypted[0]);
411: encrypted[1] = ntohl(encrypted[1]);
412: des_dec(encrypted,deskey_string,plain);
413: *p = plain[0];
414: }
415: } else
416: #endif
417: {
418: gen_fread((char *)p,sizeof(unsigned int),l,f);
419: if ( little_endian && (ox_file_io || ox_need_conv) )
420: for ( i = 0; i < l; i++, p++ )
421: *p = ntohl(*p);
422: }
1.1 noro 423: }
424:
1.14 ohara 425: #if SIZEOF_LONG == 8
1.15 noro 426: /* read l word (1word=4bytes) */
1.17 noro 427: /* pad 0 at low 32 of p[0] if l is odd */
428: /* low 32 of p[0] | high32 of p[0] | ... */
1.9 noro 429: void read_longarray(FILE *f,unsigned long *p,int l)
1.1 noro 430: {
1.23 noro 431: int i;
432: unsigned int hi,lo;
1.17 noro 433: unsigned int *q;
1.1 noro 434:
1.23 noro 435: q = (unsigned int *)p;
436: if ( l%2 ) {
437: gen_fread((char *)&hi,sizeof(unsigned int),1,f);
438: if ( little_endian && (ox_file_io || ox_need_conv) )
439: hi = ntohl(hi);
440: *p = (((unsigned long)hi)<<32);
441: p++; l--;
442: }
443: for ( i = 0; i < l; i += 2, p++ ) {
444: gen_fread((char *)&lo,sizeof(unsigned int),1,f);
445: gen_fread((char *)&hi,sizeof(unsigned int),1,f);
446: if ( little_endian && (ox_file_io || ox_need_conv) ) {
447: hi = ntohl(hi); lo = ntohl(lo);
448: }
449: *p = (((unsigned long)hi)<<32)|((unsigned long)lo);
450: }
1.1 noro 451: }
452: #endif
453:
1.22 noro 454: #if defined(_WIN64)
455: /* read l word (1word=4bytes) */
456: /* pad 0 at low 32 of p[0] if l is odd */
457: /* low 32 of p[0] | high32 of p[0] | ... */
458: void read_longarray(FILE *f,unsigned long long *p,int l)
459: {
1.23 noro 460: int i;
461: unsigned int hi,lo;
1.22 noro 462: unsigned int *q;
463:
1.23 noro 464: q = (unsigned int *)p;
465: if ( l%2 ) {
466: gen_fread((char *)&hi,sizeof(unsigned int),1,f);
467: if ( little_endian && (ox_file_io || ox_need_conv) )
468: hi = ntohl(hi);
469: *p = (((unsigned long long)hi)<<32);
470: p++; l--;
471: }
472: for ( i = 0; i < l; i += 2, p++ ) {
473: gen_fread((char *)&lo,sizeof(unsigned int),1,f);
474: gen_fread((char *)&hi,sizeof(unsigned int),1,f);
475: if ( little_endian && (ox_file_io || ox_need_conv) ) {
476: hi = ntohl(hi); lo = ntohl(lo);
477: }
478: *p = (((unsigned long long)hi)<<32)|((unsigned long long)lo);
479: }
1.22 noro 480: }
481: #endif
482:
1.9 noro 483: void read_string(FILE *f,unsigned char *p,int l)
1.1 noro 484: {
1.23 noro 485: gen_fread((char *)p,sizeof(unsigned char),l,f);
1.1 noro 486: }
487:
1.9 noro 488: void read_double(FILE *f,double *p)
1.1 noro 489: {
1.23 noro 490: unsigned int t;
1.1 noro 491:
1.23 noro 492: if ( little_endian && (ox_file_io || ox_need_conv) ) {
493: gen_fread((char *)&t,sizeof(unsigned int),1,f);
494: ((unsigned int *)p)[1] = ntohl(t);
495: gen_fread((char *)&t,sizeof(unsigned int),1,f);
496: ((unsigned int *)p)[0] = ntohl(t);
497: } else
498: gen_fread((char *)p,sizeof(double),1,f);
1.1 noro 499: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>