Annotation of OpenXM_contrib2/asir2000/io/ws_fileio.c, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/io/ws_fileio.c,v 1.2 1999/11/19 10:41:08 noro Exp $ */
2: #if defined(VISUAL) || MPI
3: #include<stdio.h>
4: #include"wsio.h"
5:
6: STREAM* WSIO_open(int, char *);
7: int WSIO_read (char *, int, STREAM *);
8: int WSIO_write (char *, int, STREAM *);
9: int WSIO_flushbuf(STREAM *);
10: int WSIO_fillbuf(STREAM *);
11:
12: int cread (data, element_size, count, s)
13: char* data;
14: unsigned element_size;
15: int count;
16: STREAM* s;
17: {
18: int length,total,r;
19: char *p;
20:
21: if (!s || !s->read_flag || !data
22: || !element_size || !count)
23: return 0;
24:
25: length = element_size * count;
26:
27: total = length;
28: p = data;
29: while ( length > (r = s->buf_size - s->p) ) {
30: memcpy((void *)p,(void *)(s->buf+s->p),r);
31: s->p += r;
32: p += r;
33: length -= r;
34: if ( !WSIO_fillbuf(s) )
35: return (total-length)/ element_size;
36: }
37: memcpy((void *)p,(void *)(s->buf+s->p),length);
38: s->p += length;
39: return count;
40: }
41:
42: int cwrite (data, element_size, count, s)
43: char* data;
44: unsigned element_size;
45: int count;
46: STREAM* s;
47: {
48: int length,total,r;
49: char *p;
50:
51: if (!s || s->read_flag || !data
52: || !element_size || !count)
53: return 0;
54:
55: length = element_size * count;
56:
57: total = length;
58: p = data;
59: while ( length > (r = s->buf_size - s->p) ) {
60: memcpy((void *)(s->buf+s->p),(void *)p,r);
61: s->p += r;
62: p += r;
63: length -= r;
64: if ( !WSIO_flushbuf(s) )
65: return (total-length)/ element_size;
66: }
67: memcpy((void *)(s->buf+s->p),(void *)p,length);
68: s->p += length;
69: return count;
70: }
71:
72: int cflush(s)
73: STREAM* s;
74: {
75: if (!s || s->read_flag)
76: return EOF;
77:
78: if (!WSIO_flushbuf(s))
79: return EOF;
80: else
81: return 0;
82: }
83:
84: int WSIO_fillbuf(s)
85: STREAM* s;
86: {
87: s->buf_size = WSIO_read(s->buf, s->max_buf_size, s);
88: s->p = 0;
89:
90: return s->buf_size;
91: }
92:
93: int WSIO_flushbuf(s)
94: STREAM* s;
95: {
96: int rst;
97:
98:
99: rst = WSIO_write(s->buf, s->p, s);
100: s->p = 0;
101:
102: return rst;
103: }
104:
105: STREAM* WSIO_open(fildes, mode)
106: int fildes;
107: char* mode;
108: {
109: STREAM* rst = 0;
110: int flag = 0;
111:
112: rst = (STREAM*)malloc(sizeof(STREAM));
113: if (rst) {
114: #if defined(VISUAL)
115: _fileno(&rst->fp) = -1;
116: #elif MPI
117: #if defined(sparc)
118: (&rst->fp)->_file = -1;
119: #else
120: fileno(&rst->fp) = -1;
121: #endif
122: #endif
123: rst->fildes = fildes;
124:
125: if (mode[0] == 'r') {
126: rst->read_flag = 1;
127: rst->p = WSIO_STRING_LENGTH;
128: } else {
129: rst->read_flag = 0;
130: rst->p = 0;
131: }
132: rst->max_buf_size = rst->buf_size = WSIO_STRING_LENGTH;
133: rst->buf = (char*)malloc(WSIO_STRING_LENGTH);
134: if (!rst->buf) {
135: free (rst);
136: rst = 0;
137: }
138: rst->eof = 0;
139: rst->error = 0;
140: }
141: return rst;
142: }
143:
144: int WSIO_read (data, count, s)
145: char* data;
146: int count;
147: STREAM* s;
148: {
149: int size;
150:
151: if (!s)
152: return 0;
153:
154: #if defined(VISUAL)
155: size = recv(s->fildes,data,count,0);
156: #elif MPI
157: {
158: MPI_Status status;
159:
160: MPI_Recv(&size,1,MPI_INT,s->fildes,0,MPI_COMM_WORLD,&status);
161: if ( size > count )
162: size = count;
163: MPI_Recv(data,size,MPI_CHAR,s->fildes,0,MPI_COMM_WORLD,&status);
164: }
165: #endif
166: return size;
167: }
168:
169: int WSIO_write (data, count, s)
170: char* data;
171: int count;
172: STREAM* s;
173: {
174: int size;
175:
176: if (!s || !count)
177: return 0;
178:
179: #if defined(VISUAL)
180: size = send(s->fildes,data,count,0);
181: return size;
182: #elif MPI
183: MPI_Ssend(&count,1,MPI_INT,s->fildes,0,MPI_COMM_WORLD);
184: MPI_Ssend(data,count,MPI_CHAR,s->fildes,0,MPI_COMM_WORLD);
185: return count;
186: #endif
187: }
188:
189: #if MPI
190: int mpi_nprocs,mpi_myid;
191:
192: void mpi_init()
193: {
194: int argc;
195: char *argv[1];
196:
197: argc = 0; argv[0] = 0;
198: MPI_Init(&argc,&argv);
199: MPI_Comm_size(MPI_COMM_WORLD,&mpi_nprocs);
200: MPI_Comm_rank(MPI_COMM_WORLD,&mpi_myid);
201: }
202:
203: void mpi_finalize()
204: {
205: MPI_Finalize();
206: }
207: #endif
208: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>