static void ficlPcp(ficlVm *vm) { char srcfile[FICL_COUNTED_STRING_MAX]; ficlCountedString *srccounted = (ficlCountedString *)srcfile; char dstfile[FICL_COUNTED_STRING_MAX]; ficlCountedString *dstcounted = (ficlCountedString *)dstfile; ficlVmGetString(vm, srccounted, ' '); ficlVmGetString(vm, dstcounted, '\n'); pcp(FICL_COUNTED_STRING_GET_POINTER(*srccounted),FICL_COUNTED_STRING_GET_POINTER(*dstcounted)); }
static void ficlIsfDel(ficlVm *vm) { char filename[FICL_COUNTED_STRING_MAX]; ficlCountedString *counted = (ficlCountedString *)filename; ficlVmGetString(vm, counted, '\n'); isfdel(FICL_COUNTED_STRING_GET_POINTER(*counted)); }
static void ficlIcatFileWrite(ficlVm *vm) { uint32_t len; char *buffer, md5[36]; char filename[FICL_COUNTED_STRING_MAX]; ficlCountedString *counted = (ficlCountedString *)filename; FICL_STACK_CHECK(vm->dataStack,2,0); len = ficlStackPopUnsigned(vm->dataStack); buffer = (char *) ficlStackPopPointer(vm->dataStack); calcMd5(buffer,len,md5); ficlVmGetString(vm, counted, '\n'); writeIsfFile(FICL_COUNTED_STRING_GET_POINTER(*counted),md5,len,buffer,1); }
/* ** Ficl interface to system (ANSI) ** Gets a newline (or NULL) delimited string from the input ** and feeds it to the ANSI system function... ** Example: ** system del *.* ** \ ouch! */ static void ficlPrimitiveSystem(ficlVm *vm) { ficlCountedString *counted = (ficlCountedString *)vm->pad; ficlVmGetString(vm, counted, '\n'); if (FICL_COUNTED_STRING_GET_LENGTH(*counted) > 0) { int returnValue = system(FICL_COUNTED_STRING_GET_POINTER(*counted)); if (returnValue) { sprintf(vm->pad, "System call returned %d\n", returnValue); ficlVmTextOut(vm, vm->pad); ficlVmThrow(vm, FICL_VM_STATUS_QUIT); } } else { ficlVmTextOut(vm, "Warning (system): nothing happened\n"); } return; }
static void ficlPrimitiveLoad_(ficlVm *vm, int warn, int icat_special) { char filename[FICL_COUNTED_STRING_MAX]; ficlCountedString *counted = (ficlCountedString *)filename; char *file_data; unsigned size = 0; int line_num; char *line, *c, *end; ficlCell oldSourceId; ficlString s; int result = 0; char *context; int offset; if (icat_special) { int index; FICL_STACK_CHECK(vm->dataStack,1,0); index = ficlStackPopInteger(vm->dataStack); sprintf(filename,"%sicat_config%02d.tbl",ICAT_DEV_PREFIX,index); file_data = find_and_load(filename,&size,&offset); } else { ficlVmGetString(vm, counted, '\n'); if (FICL_COUNTED_STRING_GET_LENGTH(*counted) <= 0) { ficlVmTextOut(vm, "Warning (load): nothing happened\n"); return; } file_data = find_and_load(FICL_COUNTED_STRING_GET_POINTER(*counted),&size,&offset); } /* ** get the file's size and make sure it exists */ if (file_data == NULL) if (warn) { ficlVmTextOut(vm, "Unable to open file "); ficlVmTextOut(vm, FICL_COUNTED_STRING_GET_POINTER(*counted)); ficlVmTextOut(vm, "\n"); ficlVmThrow(vm, FICL_VM_STATUS_QUIT); } else return; oldSourceId = vm->sourceId; vm->sourceId.i = -1; /* feed each line to ficlExec */ for (end = file_data + size + offset, line = file_data + offset, line_num = 1; line < end; line = ++c, line_num++) { int length; for (c = line; *c != '\n' && c<end; c++); length = c-line; if (length > 0) { FICL_STRING_SET_POINTER(s, line); FICL_STRING_SET_LENGTH(s, length); result = ficlVmExecuteString(vm, s); /* handle "bye" in loaded files. --lch */ switch (result) { case FICL_VM_STATUS_OUT_OF_TEXT: case FICL_VM_STATUS_USER_EXIT: break; default: vm->sourceId = oldSourceId; free(file_data); file_data = NULL; ficlVmThrowError(vm, "Error loading file <%s> line %d", FICL_COUNTED_STRING_GET_POINTER(*counted), line_num); break; } } } if (file_data != NULL) free(file_data); vm->sourceId = oldSourceId; /* handle "bye" in loaded files. --lch */ if (result == FICL_VM_STATUS_USER_EXIT) ficlVmThrow(vm, FICL_VM_STATUS_USER_EXIT); return; }
static void ficlPrimitiveLoad(ficlVm *vm) { char buffer[BUFFER_SIZE]; char filename[BUFFER_SIZE]; ficlCountedString *counted = (ficlCountedString *)filename; int line = 0; FILE *f; int result = 0; ficlCell oldSourceId; ficlString s; ficlVmGetString(vm, counted, '\n'); if (FICL_COUNTED_STRING_GET_LENGTH(*counted) <= 0) { ficlVmTextOut(vm, "Warning (load): nothing happened\n"); return; } /* ** get the file's size and make sure it exists */ f = fopen(FICL_COUNTED_STRING_GET_POINTER(*counted), "r"); if (!f) { ficlVmTextOut(vm, "Unable to open file "); ficlVmTextOut(vm, FICL_COUNTED_STRING_GET_POINTER(*counted)); ficlVmTextOut(vm, "\n"); ficlVmThrow(vm, FICL_VM_STATUS_QUIT); } oldSourceId = vm->sourceId; vm->sourceId.p = (void *)f; /* feed each line to ficlExec */ while (fgets(buffer, BUFFER_SIZE, f)) { int length = strlen(buffer) - 1; line++; if (length <= 0) continue; if (buffer[length] == '\n') buffer[length--] = '\0'; FICL_STRING_SET_POINTER(s, buffer); FICL_STRING_SET_LENGTH(s, length + 1); result = ficlVmExecuteString(vm, s); /* handle "bye" in loaded files. --lch */ switch (result) { case FICL_VM_STATUS_OUT_OF_TEXT: case FICL_VM_STATUS_USER_EXIT: break; default: vm->sourceId = oldSourceId; fclose(f); ficlVmThrowError(vm, "Error loading file <%s> line %d", FICL_COUNTED_STRING_GET_POINTER(*counted), line); break; } } /* ** Pass an empty line with SOURCE-ID == -1 to flush ** any pending REFILLs (as required by FILE wordset) */ vm->sourceId.i = -1; FICL_STRING_SET_FROM_CSTRING(s, ""); ficlVmExecuteString(vm, s); vm->sourceId = oldSourceId; fclose(f); /* handle "bye" in loaded files. --lch */ if (result == FICL_VM_STATUS_USER_EXIT) ficlVmThrow(vm, FICL_VM_STATUS_USER_EXIT); return; }