Beispiel #1
0
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;
}
Beispiel #2
0
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);
}
Beispiel #3
0
value sys_close(value fd)
{
	if (close(VAL_TO_INT(fd)) != 0) {
		sys_error(NULL);
	}

	return Atom(0);
}
Beispiel #4
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);
        }
    }
}
Beispiel #5
0
void sys_exit(value retcode)
{
  flush_stdouterr();
  exit(VAL_TO_INT(retcode));
}