static Something systemSystem(Thread *thread) { char *command = stringToChar(stackGetVariable(0, thread).object->value); FILE *f = popen(command, "r"); free(command); if (!f) { return NOTHINGNESS; } size_t bufferUsedSize = 0; int bufferSize = 50; Object *buffer = newArray(bufferSize); while (fgets((char *)buffer->value + bufferUsedSize, bufferSize - (int)bufferUsedSize, f) != NULL) { bufferUsedSize = strlen(buffer->value); if (bufferSize - bufferUsedSize < 2) { bufferSize *= 2; buffer = resizeArray(buffer, bufferSize); } } bufferUsedSize = strlen(buffer->value); EmojicodeInteger len = u8_strlen_l(buffer->value, bufferUsedSize); Object *so = newObject(CL_STRING); stackSetVariable(0, somethingObject(so), thread); String *string = so->value; string->length = len; Object *chars = newArray(len * sizeof(EmojicodeChar)); string = stackGetVariable(0, thread).object->value; string->characters = chars; u8_toucs(characters(string), len, buffer->value, bufferUsedSize); return stackGetVariable(0, thread); }
static void systemSystem(Thread *thread) { FILE *f = popen(stringToCString(thread->variable(0).object), "r"); if (f == nullptr) { thread->returnNothingnessFromFunction(); return; } size_t bufferUsedSize = 0; int bufferSize = 50; auto buffer = thread->retain(newArray(bufferSize)); while (fgets(buffer->val<char>() + bufferUsedSize, bufferSize - (int)bufferUsedSize, f) != nullptr) { bufferUsedSize = strlen(buffer->val<char>()); if (bufferSize - bufferUsedSize < 2) { bufferSize *= 2; buffer = resizeArray(buffer.unretainedPointer(), bufferSize, thread); } } bufferUsedSize = strlen(buffer->val<char>()); EmojicodeInteger len = u8_strlen_l(buffer->val<char>(), bufferUsedSize); auto so = thread->retain(newObject(CL_STRING)); auto *string = so->val<String>(); string->length = len; Object *chars = newArray(len * sizeof(EmojicodeChar)); string = so->val<String>(); string->charactersObject = chars; u8_toucs(string->characters(), len, buffer->val<char>(), bufferUsedSize); thread->release(2); thread->returnFromFunction(so.unretainedPointer()); }