value type_num_str(value f) { if (!f->L) return 0; { value x = arg(f->R); if (x->T == type_num) f = reduce_str(f,num_str(get_num(x))); else f = reduce_void(f); drop(x); return f; } }
/* (var_get var) returns val, where val is the current value of var. */ value type_var_get(value f) { if (!f->L) return 0; { value x = arg(f->R); if (x->T == type_var) f = hold(get_var(x)); else f = reduce_void(f); drop(x); return f; } }
/* (fclose fh) Close the file handle. */ value type_fclose(value f) { if (!f->L) return 0; { value out = arg(f->R); if (out->T == type_file) { fclose(get_fh(out)); f = hold(&QI); } else f = reduce_void(f); drop(out); return f; } }
/* (remove path) Remove path from file system; return 0 if successful or -1 otherwise. */ value type_remove(value f) { if (!f->L) return 0; { value x = arg(f->R); if (x->T == type_str) { string path = get_str(x); int code = remove(path->data); f = Qnum0(code); } else f = reduce_void(f); drop(x); return f; } }
/* (var_put var val) replaces the value of the variable. */ value type_var_put(value f) { if (!f->L || !f->L->L) return 0; { value x = arg(f->L->R); if (x->T == type_var) { value v = arg(f->R); drop(x->R->R); x->R->R = v; f = hold(&QI); } else f = reduce_void(f); drop(x); return f; } }
/* (fopen path mode) Open a file and return fh, where fh is the open file handle or void on failure. */ value type_fopen(value f) { if (!f->L || !f->L->L) return 0; { value x = arg(f->L->R); value y = arg(f->R); if (x->T == type_str && y->T == type_str) { string path = get_str(x); string mode = get_str(y); FILE *fh = fopen(path->data,mode->data); f = fh ? Qfile(fh) : hold(&Qvoid); } else f = reduce_void(f); drop(x); drop(y); return f; } }
static value op_flock(value f, int operation) { if (!f->L) return 0; { value x = arg(f->R); if (x->T == type_file) { int code = flock(fileno(get_fh(x)),operation); if (code < 0) { perror("flock"); die(0); } f = hold(&QI); } else f = reduce_void(f); drop(x); return f; } }
/* (void x) = void */ value type_void(value f) { if (!f->L) return 0; return reduce_void(f); }