int32_t sb_compile_context_dict_find(Val context_dict, Val name, char kind) { char stack_buf[20]; char* buf; int size = nb_string_byte_size(name); if (size + 1 >= 20) { buf = malloc(size + 2); } else { buf = stack_buf; } buf[0] = kind; memcpy(buf + 1, nb_string_ptr(name), size); Val res; int offset; bool found = nb_dict_find(context_dict, buf, size + 1, &res); if (found) { offset = VAL_TO_INT(res); } else { offset = -1; } if (size + 1 >= 20) { free(buf); } return offset; }
value sys_open(value path, value flags, value perm) { int ret; ret = open(String_val(path), convert_flag_list(flags, sys_open_flags), VAL_TO_INT(perm)); if (ret == -1) sys_error(String_val(path)); return LONG_TO_VAL(ret); }
value sys_close(value fd) { if (close(VAL_TO_INT(fd)) != 0) { sys_error(NULL); } return Atom(0); }
value sml_makestring_of_char(value arg) { unsigned char c; char buff[8]; c = VAL_TO_INT(arg); switch (c) { case '"': return copy_string("#\"\\\"\""); case '\\': return copy_string("#\"\\\\\""); case '\a': return copy_string("#\"\\a\""); case '\b': return copy_string("#\"\\b\""); case '\t': return copy_string("#\"\\t\""); case '\n': return copy_string("#\"\\n\""); case '\v': return copy_string("#\"\\v\""); case '\f': return copy_string("#\"\\f\""); case '\r': return copy_string("#\"\\r\""); default: buff[0] = '#'; buff[1] = '"'; if( c <= 31 ) { buff[2] = '\\'; buff[3] = '^'; buff[4] = c + 64; buff[5] = '"'; buff[6] = 0; return copy_string(buff); } else if( (32 <= c && c <= 126) || (128 <= c && c <= 254) ) { buff[2] = c; buff[3] = '"'; buff[4] = 0; return copy_string(buff); } else { buff[2] = '\\'; buff[3] = 48 + c / 100; buff[4] = 48 + (c / 10) % 10; buff[5] = 48 + c % 10; buff[6] = '"'; buff[7] = 0; return copy_string(buff); } } }
void sys_exit(value retcode) { flush_stdouterr(); exit(VAL_TO_INT(retcode)); }