xref: /titanic_51/usr/src/common/ficl/fileaccess.c (revision a1bf3f785ae05c419b339c3a2061f2b18c024f61)
1*a1bf3f78SToomas Soome #include "ficl.h"
2*a1bf3f78SToomas Soome 
3*a1bf3f78SToomas Soome #if FICL_WANT_FILE
4*a1bf3f78SToomas Soome /*
5*a1bf3f78SToomas Soome  * fileaccess.c
6*a1bf3f78SToomas Soome  *
7*a1bf3f78SToomas Soome  * Implements all of the File Access word set that can be implemented in
8*a1bf3f78SToomas Soome  * portable C.
9*a1bf3f78SToomas Soome  */
10*a1bf3f78SToomas Soome 
11*a1bf3f78SToomas Soome static void
12*a1bf3f78SToomas Soome pushIor(ficlVm *vm, int success)
13*a1bf3f78SToomas Soome {
14*a1bf3f78SToomas Soome 	int ior;
15*a1bf3f78SToomas Soome 	if (success)
16*a1bf3f78SToomas Soome 		ior = 0;
17*a1bf3f78SToomas Soome 	else
18*a1bf3f78SToomas Soome 		ior = errno;
19*a1bf3f78SToomas Soome 	ficlStackPushInteger(vm->dataStack, ior);
20*a1bf3f78SToomas Soome }
21*a1bf3f78SToomas Soome 
22*a1bf3f78SToomas Soome /* ( c-addr u fam -- fileid ior ) */
23*a1bf3f78SToomas Soome static void
24*a1bf3f78SToomas Soome ficlFileOpen(ficlVm *vm, char *writeMode)
25*a1bf3f78SToomas Soome {
26*a1bf3f78SToomas Soome 	int fam = ficlStackPopInteger(vm->dataStack);
27*a1bf3f78SToomas Soome 	int length = ficlStackPopInteger(vm->dataStack);
28*a1bf3f78SToomas Soome 	void *address = (void *)ficlStackPopPointer(vm->dataStack);
29*a1bf3f78SToomas Soome 	char mode[4];
30*a1bf3f78SToomas Soome 	FILE *f;
31*a1bf3f78SToomas Soome 	char *filename = (char *)malloc(length + 1);
32*a1bf3f78SToomas Soome 	memcpy(filename, address, length);
33*a1bf3f78SToomas Soome 	filename[length] = 0;
34*a1bf3f78SToomas Soome 
35*a1bf3f78SToomas Soome 	*mode = 0;
36*a1bf3f78SToomas Soome 
37*a1bf3f78SToomas Soome 	switch (FICL_FAM_OPEN_MODE(fam)) {
38*a1bf3f78SToomas Soome 	case 0:
39*a1bf3f78SToomas Soome 		ficlStackPushPointer(vm->dataStack, NULL);
40*a1bf3f78SToomas Soome 		ficlStackPushInteger(vm->dataStack, EINVAL);
41*a1bf3f78SToomas Soome 	goto EXIT;
42*a1bf3f78SToomas Soome 	case FICL_FAM_READ:
43*a1bf3f78SToomas Soome 		strcat(mode, "r");
44*a1bf3f78SToomas Soome 	break;
45*a1bf3f78SToomas Soome 	case FICL_FAM_WRITE:
46*a1bf3f78SToomas Soome 		strcat(mode, writeMode);
47*a1bf3f78SToomas Soome 	break;
48*a1bf3f78SToomas Soome 	case FICL_FAM_READ | FICL_FAM_WRITE:
49*a1bf3f78SToomas Soome 		strcat(mode, writeMode);
50*a1bf3f78SToomas Soome 		strcat(mode, "+");
51*a1bf3f78SToomas Soome 	break;
52*a1bf3f78SToomas Soome 	}
53*a1bf3f78SToomas Soome 
54*a1bf3f78SToomas Soome 	strcat(mode, (fam & FICL_FAM_BINARY) ? "b" : "t");
55*a1bf3f78SToomas Soome 
56*a1bf3f78SToomas Soome 	f = fopen(filename, mode);
57*a1bf3f78SToomas Soome 	if (f == NULL)
58*a1bf3f78SToomas Soome 		ficlStackPushPointer(vm->dataStack, NULL);
59*a1bf3f78SToomas Soome 	else {
60*a1bf3f78SToomas Soome 		ficlFile *ff = (ficlFile *)malloc(sizeof (ficlFile));
61*a1bf3f78SToomas Soome 		strcpy(ff->filename, filename);
62*a1bf3f78SToomas Soome 		ff->f = f;
63*a1bf3f78SToomas Soome 		ficlStackPushPointer(vm->dataStack, ff);
64*a1bf3f78SToomas Soome 
65*a1bf3f78SToomas Soome 		fseek(f, 0, SEEK_SET);
66*a1bf3f78SToomas Soome 	}
67*a1bf3f78SToomas Soome 	pushIor(vm, f != NULL);
68*a1bf3f78SToomas Soome 
69*a1bf3f78SToomas Soome EXIT:
70*a1bf3f78SToomas Soome 	free(filename);
71*a1bf3f78SToomas Soome }
72*a1bf3f78SToomas Soome 
73*a1bf3f78SToomas Soome /* ( c-addr u fam -- fileid ior ) */
74*a1bf3f78SToomas Soome static void
75*a1bf3f78SToomas Soome ficlPrimitiveOpenFile(ficlVm *vm)
76*a1bf3f78SToomas Soome {
77*a1bf3f78SToomas Soome 	ficlFileOpen(vm, "a");
78*a1bf3f78SToomas Soome }
79*a1bf3f78SToomas Soome 
80*a1bf3f78SToomas Soome /* ( c-addr u fam -- fileid ior ) */
81*a1bf3f78SToomas Soome static void
82*a1bf3f78SToomas Soome ficlPrimitiveCreateFile(ficlVm *vm)
83*a1bf3f78SToomas Soome {
84*a1bf3f78SToomas Soome 	ficlFileOpen(vm, "w");
85*a1bf3f78SToomas Soome }
86*a1bf3f78SToomas Soome 
87*a1bf3f78SToomas Soome /* ( fileid -- ior ) */
88*a1bf3f78SToomas Soome static int
89*a1bf3f78SToomas Soome ficlFileClose(ficlFile *ff)
90*a1bf3f78SToomas Soome {
91*a1bf3f78SToomas Soome 	FILE *f = ff->f;
92*a1bf3f78SToomas Soome 	free(ff);
93*a1bf3f78SToomas Soome 	return (!fclose(f));
94*a1bf3f78SToomas Soome }
95*a1bf3f78SToomas Soome 
96*a1bf3f78SToomas Soome /* ( fileid -- ior ) */
97*a1bf3f78SToomas Soome static void
98*a1bf3f78SToomas Soome ficlPrimitiveCloseFile(ficlVm *vm)
99*a1bf3f78SToomas Soome {
100*a1bf3f78SToomas Soome 	ficlFile *ff = (ficlFile *)ficlStackPopPointer(vm->dataStack);
101*a1bf3f78SToomas Soome 	pushIor(vm, ficlFileClose(ff));
102*a1bf3f78SToomas Soome }
103*a1bf3f78SToomas Soome 
104*a1bf3f78SToomas Soome /* ( c-addr u -- ior ) */
105*a1bf3f78SToomas Soome static void
106*a1bf3f78SToomas Soome ficlPrimitiveDeleteFile(ficlVm *vm)
107*a1bf3f78SToomas Soome {
108*a1bf3f78SToomas Soome 	int length = ficlStackPopInteger(vm->dataStack);
109*a1bf3f78SToomas Soome 	void *address = (void *)ficlStackPopPointer(vm->dataStack);
110*a1bf3f78SToomas Soome 
111*a1bf3f78SToomas Soome 	char *filename = (char *)malloc(length + 1);
112*a1bf3f78SToomas Soome 	memcpy(filename, address, length);
113*a1bf3f78SToomas Soome 	filename[length] = 0;
114*a1bf3f78SToomas Soome 
115*a1bf3f78SToomas Soome 	pushIor(vm, !unlink(filename));
116*a1bf3f78SToomas Soome 	free(filename);
117*a1bf3f78SToomas Soome }
118*a1bf3f78SToomas Soome 
119*a1bf3f78SToomas Soome /* ( c-addr1 u1 c-addr2 u2 -- ior ) */
120*a1bf3f78SToomas Soome static void
121*a1bf3f78SToomas Soome ficlPrimitiveRenameFile(ficlVm *vm)
122*a1bf3f78SToomas Soome {
123*a1bf3f78SToomas Soome 	int length;
124*a1bf3f78SToomas Soome 	void *address;
125*a1bf3f78SToomas Soome 	char *from;
126*a1bf3f78SToomas Soome 	char *to;
127*a1bf3f78SToomas Soome 
128*a1bf3f78SToomas Soome 	length = ficlStackPopInteger(vm->dataStack);
129*a1bf3f78SToomas Soome 	address = (void *)ficlStackPopPointer(vm->dataStack);
130*a1bf3f78SToomas Soome 	to = (char *)malloc(length + 1);
131*a1bf3f78SToomas Soome 	memcpy(to, address, length);
132*a1bf3f78SToomas Soome 	to[length] = 0;
133*a1bf3f78SToomas Soome 
134*a1bf3f78SToomas Soome 	length = ficlStackPopInteger(vm->dataStack);
135*a1bf3f78SToomas Soome 	address = (void *)ficlStackPopPointer(vm->dataStack);
136*a1bf3f78SToomas Soome 
137*a1bf3f78SToomas Soome 	from = (char *)malloc(length + 1);
138*a1bf3f78SToomas Soome 	memcpy(from, address, length);
139*a1bf3f78SToomas Soome 	from[length] = 0;
140*a1bf3f78SToomas Soome 
141*a1bf3f78SToomas Soome 	pushIor(vm, !rename(from, to));
142*a1bf3f78SToomas Soome 
143*a1bf3f78SToomas Soome 	free(from);
144*a1bf3f78SToomas Soome 	free(to);
145*a1bf3f78SToomas Soome }
146*a1bf3f78SToomas Soome 
147*a1bf3f78SToomas Soome /* ( c-addr u -- x ior ) */
148*a1bf3f78SToomas Soome static void
149*a1bf3f78SToomas Soome ficlPrimitiveFileStatus(ficlVm *vm)
150*a1bf3f78SToomas Soome {
151*a1bf3f78SToomas Soome 	int status;
152*a1bf3f78SToomas Soome 	int ior;
153*a1bf3f78SToomas Soome 
154*a1bf3f78SToomas Soome 	int length = ficlStackPopInteger(vm->dataStack);
155*a1bf3f78SToomas Soome 	void *address = (void *)ficlStackPopPointer(vm->dataStack);
156*a1bf3f78SToomas Soome 
157*a1bf3f78SToomas Soome 	char *filename = (char *)malloc(length + 1);
158*a1bf3f78SToomas Soome 	memcpy(filename, address, length);
159*a1bf3f78SToomas Soome 	filename[length] = 0;
160*a1bf3f78SToomas Soome 
161*a1bf3f78SToomas Soome 	ior = ficlFileStatus(filename, &status);
162*a1bf3f78SToomas Soome 	free(filename);
163*a1bf3f78SToomas Soome 
164*a1bf3f78SToomas Soome 	ficlStackPushInteger(vm->dataStack, status);
165*a1bf3f78SToomas Soome 	ficlStackPushInteger(vm->dataStack, ior);
166*a1bf3f78SToomas Soome }
167*a1bf3f78SToomas Soome 
168*a1bf3f78SToomas Soome /* ( fileid -- ud ior ) */
169*a1bf3f78SToomas Soome static void
170*a1bf3f78SToomas Soome ficlPrimitiveFilePosition(ficlVm *vm)
171*a1bf3f78SToomas Soome {
172*a1bf3f78SToomas Soome 	ficlFile *ff = (ficlFile *)ficlStackPopPointer(vm->dataStack);
173*a1bf3f78SToomas Soome 	long ud = ftell(ff->f);
174*a1bf3f78SToomas Soome 	ficlStackPushInteger(vm->dataStack, ud);
175*a1bf3f78SToomas Soome 	pushIor(vm, ud != -1);
176*a1bf3f78SToomas Soome }
177*a1bf3f78SToomas Soome 
178*a1bf3f78SToomas Soome /* ( fileid -- ud ior ) */
179*a1bf3f78SToomas Soome static void
180*a1bf3f78SToomas Soome ficlPrimitiveFileSize(ficlVm *vm)
181*a1bf3f78SToomas Soome {
182*a1bf3f78SToomas Soome 	ficlFile *ff = (ficlFile *)ficlStackPopPointer(vm->dataStack);
183*a1bf3f78SToomas Soome 	long ud = ficlFileSize(ff);
184*a1bf3f78SToomas Soome 	ficlStackPushInteger(vm->dataStack, ud);
185*a1bf3f78SToomas Soome 	pushIor(vm, ud != -1);
186*a1bf3f78SToomas Soome }
187*a1bf3f78SToomas Soome 
188*a1bf3f78SToomas Soome /* ( i*x fileid -- j*x ) */
189*a1bf3f78SToomas Soome #define	nLINEBUF	256
190*a1bf3f78SToomas Soome static void
191*a1bf3f78SToomas Soome ficlPrimitiveIncludeFile(ficlVm *vm)
192*a1bf3f78SToomas Soome {
193*a1bf3f78SToomas Soome 	ficlFile *ff = (ficlFile *)ficlStackPopPointer(vm->dataStack);
194*a1bf3f78SToomas Soome 	ficlCell id = vm->sourceId;
195*a1bf3f78SToomas Soome 	int  except = FICL_VM_STATUS_OUT_OF_TEXT;
196*a1bf3f78SToomas Soome 	long currentPosition, totalSize;
197*a1bf3f78SToomas Soome 	long size;
198*a1bf3f78SToomas Soome 	ficlString s;
199*a1bf3f78SToomas Soome 	vm->sourceId.p = (void *)ff;
200*a1bf3f78SToomas Soome 
201*a1bf3f78SToomas Soome 	currentPosition = ftell(ff->f);
202*a1bf3f78SToomas Soome 	totalSize = ficlFileSize(ff);
203*a1bf3f78SToomas Soome 	size = totalSize - currentPosition;
204*a1bf3f78SToomas Soome 
205*a1bf3f78SToomas Soome 	if ((totalSize != -1) && (currentPosition != -1) && (size > 0)) {
206*a1bf3f78SToomas Soome 		char *buffer = (char *)malloc(size);
207*a1bf3f78SToomas Soome 		long got = fread(buffer, 1, size, ff->f);
208*a1bf3f78SToomas Soome 		if (got == size) {
209*a1bf3f78SToomas Soome 			FICL_STRING_SET_POINTER(s, buffer);
210*a1bf3f78SToomas Soome 			FICL_STRING_SET_LENGTH(s, size);
211*a1bf3f78SToomas Soome 			except = ficlVmExecuteString(vm, s);
212*a1bf3f78SToomas Soome 		}
213*a1bf3f78SToomas Soome 	}
214*a1bf3f78SToomas Soome 
215*a1bf3f78SToomas Soome 	if ((except < 0) && (except != FICL_VM_STATUS_OUT_OF_TEXT))
216*a1bf3f78SToomas Soome 		ficlVmThrow(vm, except);
217*a1bf3f78SToomas Soome 
218*a1bf3f78SToomas Soome 	/*
219*a1bf3f78SToomas Soome 	 * Pass an empty line with SOURCE-ID == -1 to flush
220*a1bf3f78SToomas Soome 	 * any pending REFILLs (as required by FILE wordset)
221*a1bf3f78SToomas Soome 	 */
222*a1bf3f78SToomas Soome 	vm->sourceId.i = -1;
223*a1bf3f78SToomas Soome 	FICL_STRING_SET_FROM_CSTRING(s, "");
224*a1bf3f78SToomas Soome 	ficlVmExecuteString(vm, s);
225*a1bf3f78SToomas Soome 
226*a1bf3f78SToomas Soome 	vm->sourceId = id;
227*a1bf3f78SToomas Soome 	ficlFileClose(ff);
228*a1bf3f78SToomas Soome }
229*a1bf3f78SToomas Soome 
230*a1bf3f78SToomas Soome /* ( c-addr u1 fileid -- u2 ior ) */
231*a1bf3f78SToomas Soome static void
232*a1bf3f78SToomas Soome ficlPrimitiveReadFile(ficlVm *vm)
233*a1bf3f78SToomas Soome {
234*a1bf3f78SToomas Soome 	ficlFile *ff = (ficlFile *)ficlStackPopPointer(vm->dataStack);
235*a1bf3f78SToomas Soome 	int length = ficlStackPopInteger(vm->dataStack);
236*a1bf3f78SToomas Soome 	void *address = (void *)ficlStackPopPointer(vm->dataStack);
237*a1bf3f78SToomas Soome 	int result;
238*a1bf3f78SToomas Soome 
239*a1bf3f78SToomas Soome 	clearerr(ff->f);
240*a1bf3f78SToomas Soome 	result = fread(address, 1, length, ff->f);
241*a1bf3f78SToomas Soome 
242*a1bf3f78SToomas Soome 	ficlStackPushInteger(vm->dataStack, result);
243*a1bf3f78SToomas Soome 	pushIor(vm, ferror(ff->f) == 0);
244*a1bf3f78SToomas Soome }
245*a1bf3f78SToomas Soome 
246*a1bf3f78SToomas Soome /* ( c-addr u1 fileid -- u2 flag ior ) */
247*a1bf3f78SToomas Soome static void
248*a1bf3f78SToomas Soome ficlPrimitiveReadLine(ficlVm *vm)
249*a1bf3f78SToomas Soome {
250*a1bf3f78SToomas Soome 	ficlFile *ff = (ficlFile *)ficlStackPopPointer(vm->dataStack);
251*a1bf3f78SToomas Soome 	int length = ficlStackPopInteger(vm->dataStack);
252*a1bf3f78SToomas Soome 	char *address = (char *)ficlStackPopPointer(vm->dataStack);
253*a1bf3f78SToomas Soome 	int error;
254*a1bf3f78SToomas Soome 	int flag;
255*a1bf3f78SToomas Soome 
256*a1bf3f78SToomas Soome 	if (feof(ff->f)) {
257*a1bf3f78SToomas Soome 		ficlStackPushInteger(vm->dataStack, -1);
258*a1bf3f78SToomas Soome 		ficlStackPushInteger(vm->dataStack, 0);
259*a1bf3f78SToomas Soome 		ficlStackPushInteger(vm->dataStack, 0);
260*a1bf3f78SToomas Soome 		return;
261*a1bf3f78SToomas Soome 	}
262*a1bf3f78SToomas Soome 
263*a1bf3f78SToomas Soome 	clearerr(ff->f);
264*a1bf3f78SToomas Soome 	*address = 0;
265*a1bf3f78SToomas Soome 	fgets(address, length, ff->f);
266*a1bf3f78SToomas Soome 
267*a1bf3f78SToomas Soome 	error = ferror(ff->f);
268*a1bf3f78SToomas Soome 	if (error != 0) {
269*a1bf3f78SToomas Soome 		ficlStackPushInteger(vm->dataStack, -1);
270*a1bf3f78SToomas Soome 		ficlStackPushInteger(vm->dataStack, 0);
271*a1bf3f78SToomas Soome 		ficlStackPushInteger(vm->dataStack, error);
272*a1bf3f78SToomas Soome 		return;
273*a1bf3f78SToomas Soome 	}
274*a1bf3f78SToomas Soome 
275*a1bf3f78SToomas Soome 	length = strlen(address);
276*a1bf3f78SToomas Soome 	flag = (length > 0);
277*a1bf3f78SToomas Soome 	if (length && ((address[length - 1] == '\r') ||
278*a1bf3f78SToomas Soome 	    (address[length - 1] == '\n')))
279*a1bf3f78SToomas Soome 		length--;
280*a1bf3f78SToomas Soome 
281*a1bf3f78SToomas Soome 	ficlStackPushInteger(vm->dataStack, length);
282*a1bf3f78SToomas Soome 	ficlStackPushInteger(vm->dataStack, flag);
283*a1bf3f78SToomas Soome 	ficlStackPushInteger(vm->dataStack, 0); /* ior */
284*a1bf3f78SToomas Soome }
285*a1bf3f78SToomas Soome 
286*a1bf3f78SToomas Soome /* ( c-addr u1 fileid -- ior ) */
287*a1bf3f78SToomas Soome static void
288*a1bf3f78SToomas Soome ficlPrimitiveWriteFile(ficlVm *vm)
289*a1bf3f78SToomas Soome {
290*a1bf3f78SToomas Soome 	ficlFile *ff = (ficlFile *)ficlStackPopPointer(vm->dataStack);
291*a1bf3f78SToomas Soome 	int length = ficlStackPopInteger(vm->dataStack);
292*a1bf3f78SToomas Soome 	void *address = (void *)ficlStackPopPointer(vm->dataStack);
293*a1bf3f78SToomas Soome 
294*a1bf3f78SToomas Soome 	clearerr(ff->f);
295*a1bf3f78SToomas Soome 	fwrite(address, 1, length, ff->f);
296*a1bf3f78SToomas Soome 	pushIor(vm, ferror(ff->f) == 0);
297*a1bf3f78SToomas Soome }
298*a1bf3f78SToomas Soome 
299*a1bf3f78SToomas Soome /* ( c-addr u1 fileid -- ior ) */
300*a1bf3f78SToomas Soome static void
301*a1bf3f78SToomas Soome ficlPrimitiveWriteLine(ficlVm *vm)
302*a1bf3f78SToomas Soome {
303*a1bf3f78SToomas Soome 	ficlFile *ff = (ficlFile *)ficlStackPopPointer(vm->dataStack);
304*a1bf3f78SToomas Soome 	size_t length = (size_t)ficlStackPopInteger(vm->dataStack);
305*a1bf3f78SToomas Soome 	void *address = (void *)ficlStackPopPointer(vm->dataStack);
306*a1bf3f78SToomas Soome 
307*a1bf3f78SToomas Soome 	clearerr(ff->f);
308*a1bf3f78SToomas Soome 	if (fwrite(address, 1, length, ff->f) == length)
309*a1bf3f78SToomas Soome 		fwrite("\n", 1, 1, ff->f);
310*a1bf3f78SToomas Soome 	pushIor(vm, ferror(ff->f) == 0);
311*a1bf3f78SToomas Soome }
312*a1bf3f78SToomas Soome 
313*a1bf3f78SToomas Soome /* ( ud fileid -- ior ) */
314*a1bf3f78SToomas Soome static void
315*a1bf3f78SToomas Soome ficlPrimitiveRepositionFile(ficlVm *vm)
316*a1bf3f78SToomas Soome {
317*a1bf3f78SToomas Soome 	ficlFile *ff = (ficlFile *)ficlStackPopPointer(vm->dataStack);
318*a1bf3f78SToomas Soome 	size_t ud = (size_t)ficlStackPopInteger(vm->dataStack);
319*a1bf3f78SToomas Soome 
320*a1bf3f78SToomas Soome 	pushIor(vm, fseek(ff->f, ud, SEEK_SET) == 0);
321*a1bf3f78SToomas Soome }
322*a1bf3f78SToomas Soome 
323*a1bf3f78SToomas Soome /* ( fileid -- ior ) */
324*a1bf3f78SToomas Soome static void
325*a1bf3f78SToomas Soome ficlPrimitiveFlushFile(ficlVm *vm)
326*a1bf3f78SToomas Soome {
327*a1bf3f78SToomas Soome 	ficlFile *ff = (ficlFile *)ficlStackPopPointer(vm->dataStack);
328*a1bf3f78SToomas Soome 	pushIor(vm, fflush(ff->f) == 0);
329*a1bf3f78SToomas Soome }
330*a1bf3f78SToomas Soome 
331*a1bf3f78SToomas Soome #if FICL_PLATFORM_HAS_FTRUNCATE
332*a1bf3f78SToomas Soome /* ( ud fileid -- ior ) */
333*a1bf3f78SToomas Soome static void
334*a1bf3f78SToomas Soome ficlPrimitiveResizeFile(ficlVm *vm)
335*a1bf3f78SToomas Soome {
336*a1bf3f78SToomas Soome 	ficlFile *ff = (ficlFile *)ficlStackPopPointer(vm->dataStack);
337*a1bf3f78SToomas Soome 	size_t ud = (size_t)ficlStackPopInteger(vm->dataStack);
338*a1bf3f78SToomas Soome 
339*a1bf3f78SToomas Soome 	pushIor(vm, ficlFileTruncate(ff, ud) == 0);
340*a1bf3f78SToomas Soome }
341*a1bf3f78SToomas Soome #endif /* FICL_PLATFORM_HAS_FTRUNCATE */
342*a1bf3f78SToomas Soome #endif /* FICL_WANT_FILE */
343*a1bf3f78SToomas Soome 
344*a1bf3f78SToomas Soome void
345*a1bf3f78SToomas Soome ficlSystemCompileFile(ficlSystem *system)
346*a1bf3f78SToomas Soome {
347*a1bf3f78SToomas Soome #if !FICL_WANT_FILE
348*a1bf3f78SToomas Soome 	FICL_IGNORE(system);
349*a1bf3f78SToomas Soome #else
350*a1bf3f78SToomas Soome 	ficlDictionary *dictionary = ficlSystemGetDictionary(system);
351*a1bf3f78SToomas Soome 	ficlDictionary *environment = ficlSystemGetEnvironment(system);
352*a1bf3f78SToomas Soome 
353*a1bf3f78SToomas Soome 	FICL_SYSTEM_ASSERT(system, dictionary);
354*a1bf3f78SToomas Soome 	FICL_SYSTEM_ASSERT(system, environment);
355*a1bf3f78SToomas Soome 
356*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "create-file",
357*a1bf3f78SToomas Soome 	    ficlPrimitiveCreateFile,  FICL_WORD_DEFAULT);
358*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "open-file",
359*a1bf3f78SToomas Soome 	    ficlPrimitiveOpenFile,  FICL_WORD_DEFAULT);
360*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "close-file",
361*a1bf3f78SToomas Soome 	    ficlPrimitiveCloseFile,  FICL_WORD_DEFAULT);
362*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "include-file",
363*a1bf3f78SToomas Soome 	    ficlPrimitiveIncludeFile,  FICL_WORD_DEFAULT);
364*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "read-file",
365*a1bf3f78SToomas Soome 	    ficlPrimitiveReadFile,  FICL_WORD_DEFAULT);
366*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "read-line",
367*a1bf3f78SToomas Soome 	    ficlPrimitiveReadLine,  FICL_WORD_DEFAULT);
368*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "write-file",
369*a1bf3f78SToomas Soome 	    ficlPrimitiveWriteFile,  FICL_WORD_DEFAULT);
370*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "write-line",
371*a1bf3f78SToomas Soome 	    ficlPrimitiveWriteLine,  FICL_WORD_DEFAULT);
372*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "file-position",
373*a1bf3f78SToomas Soome 	    ficlPrimitiveFilePosition,  FICL_WORD_DEFAULT);
374*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "file-size",
375*a1bf3f78SToomas Soome 	    ficlPrimitiveFileSize,  FICL_WORD_DEFAULT);
376*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "reposition-file",
377*a1bf3f78SToomas Soome 	    ficlPrimitiveRepositionFile,  FICL_WORD_DEFAULT);
378*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "file-status",
379*a1bf3f78SToomas Soome 	    ficlPrimitiveFileStatus,  FICL_WORD_DEFAULT);
380*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "flush-file",
381*a1bf3f78SToomas Soome 	    ficlPrimitiveFlushFile,  FICL_WORD_DEFAULT);
382*a1bf3f78SToomas Soome 
383*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "delete-file",
384*a1bf3f78SToomas Soome 	    ficlPrimitiveDeleteFile,  FICL_WORD_DEFAULT);
385*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "rename-file",
386*a1bf3f78SToomas Soome 	    ficlPrimitiveRenameFile,  FICL_WORD_DEFAULT);
387*a1bf3f78SToomas Soome 
388*a1bf3f78SToomas Soome #if FICL_PLATFORM_HAS_FTRUNCATE
389*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dictionary, "resize-file",
390*a1bf3f78SToomas Soome 	    ficlPrimitiveResizeFile,  FICL_WORD_DEFAULT);
391*a1bf3f78SToomas Soome 
392*a1bf3f78SToomas Soome 	ficlDictionarySetConstant(environment, "file", FICL_TRUE);
393*a1bf3f78SToomas Soome 	ficlDictionarySetConstant(environment, "file-ext", FICL_TRUE);
394*a1bf3f78SToomas Soome #else /*  FICL_PLATFORM_HAS_FTRUNCATE */
395*a1bf3f78SToomas Soome 	ficlDictionarySetConstant(environment, "file", FICL_FALSE);
396*a1bf3f78SToomas Soome 	ficlDictionarySetConstant(environment, "file-ext", FICL_FALSE);
397*a1bf3f78SToomas Soome #endif /* FICL_PLATFORM_HAS_FTRUNCATE */
398*a1bf3f78SToomas Soome 
399*a1bf3f78SToomas Soome #endif /* !FICL_WANT_FILE */
400*a1bf3f78SToomas Soome }
401