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