STRING prim_GenericOS_readlink(const char *filename) { #if !defined(HAVE_CONFIG_H) || defined(HAVE_READLINK) char buf[128], *p; ssize_t n, len; void *obj; ASSERT(OBJ_TYPE(filename) == OBJTYPE_UNBOXED_VECTOR); n = readlink(filename, buf, sizeof(buf)); if (n < 0) return NULL; if ((size_t)n < sizeof(buf)) return sml_str_new2(buf, n); p = NULL; for (len = sizeof(buf); n >= len; len *= 2) { p = xrealloc(p, len); n = readlink(filename, buf, len); } if (n < 0) { free(p); return NULL; } obj = sml_str_new2(buf, n); free(p); return obj; #else errno = EIO; return NULL; #endif /* HAVE_READLINK */ }
static STRING fmt_word(unsigned int value, unsigned int radix) { char buf[sizeof(unsigned int) * CHAR_BIT + sizeof("")]; unsigned int i = sizeof(buf); i = fmt(value, radix, buf, i); return sml_str_new2(&buf[i], sizeof(buf) - i); }
STRING prim_String_substring(const char *str, int beg, int len) { ASSERT(OBJ_TYPE(str) == OBJTYPE_UNBOXED_VECTOR); ASSERT(beg >= 0 && len >= 0); ASSERT((size_t)(beg + len) <= OBJ_STR_SIZE(str)); return sml_str_new2(&str[beg], len); }
static STRING fmt_int(int value, unsigned int radix) { char buf[sizeof(unsigned int) * CHAR_BIT + sizeof("~")]; unsigned int i = sizeof(buf); unsigned int n; /* assume that |INT_MIN| <= UINT_MAX */ n = (value < 0) ? 0U - (unsigned int)value : (unsigned int)value; i = fmt(n, radix, buf, i); if (value < 0) buf[--i] = '~'; return sml_str_new2(&buf[i], sizeof(buf) - i); }
STRING prim_UnmanagedMemory_import(void *ptr, unsigned int len) { return sml_str_new2(ptr, len); }
char * sml_str_new(const char *str) { return sml_str_new2(str, strlen(str)); }