String Char_str__g(Char self) { // Returns the string representation of the character. String ret = String_alloc(2); assert(self < 0xf && "Not implemented for Unicode chars"); ret->length = 1; ret->data[0] = self; return ret; }
String *String_add(String *s, String *t) { if ( s==NULL ) return t; // don't REF/DEREF as we might free our return value if ( t==NULL ) return s; REF((heap_object *)s); REF((heap_object *)t); size_t n = strlen(s->str) + strlen(t->str); String *u = String_alloc(n); strcpy(u->str, s->str); strcat(u->str, t->str); DEREF((heap_object *)s); DEREF((heap_object *)t); return u; }
String *String_add(String *s, String *t) { if ( s == NULL && t == NULL) { null_pointer_error("Addition Operator cannot be applied to two NULL string objects\n"); return NIL_STRING; } if ( s == NULL ) return t; // don't REF/DEREF as we might free our return value if ( t == NULL ) return s; REF((heap_object *)s); REF((heap_object *)t); size_t n = strlen(s->str) + strlen(t->str); String *u = String_alloc(n); strcpy(u->str, s->str); strcat(u->str, t->str); DEREF((heap_object *)s); DEREF((heap_object *)t); return u; }
String Os_strerror(Int error) { // Returns a message describing the OS-level error. String ret = String_alloc(1024); #ifdef WINDOWS DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM; LPTSTR buffer = ret->data; ret->length = FormatMessage(flags, 0, error, 0, buffer, 1024, 0); if (ret->length) { return ret; } #else if (!strerror_r(error, (char*)ret->data, 1024)) { return ret; } const char* msg = gai_strerror(error); if (msg) { strncpy((char*)ret->data, msg, 1024); ret->length = strlen((char*)ret->data); return ret; } #endif Boot_abort(); return 0; }
// ----- allocator defmethod(OBJ, galloc, pmString) // lazy alloc retmethod(_1); endmethod // ----- destructor // generic gdeinit from ValueSequence // ----- constructors defalias (OBJ, (ginitWithStr)gnewWithStr, pmString, (STR)str); defmethod(OBJ, ginitWithStr , pmString, (STR)str) U32 size = strlen(str); struct String* s = String_alloc(size); memcpy(s->value, str, s->size = size); retmethod((OBJ)s); endmethod defalias (OBJ, (ginitWith)gnewWith, pmString, String); defmethod(OBJ, ginitWith , pmString, String) // copy struct String* str = String_alloc(self2->size); memcpy(str->value, self2->value, str->size = self2->size); retmethod( (OBJ)str ); endmethod
String Float_str__g(Float self) { String ret = String_alloc(64); snprintf((char*)ret->data, 64, "%g", self); ret->length = strlen((char*)ret->data); return ret; }
String *String_new(char *orig) { String *s = String_alloc(strlen(orig)); strcpy(s->str, orig); return s; }