|
|
@@ -771,7 +771,7 @@ qi_value_t *qi_make_string_copy(qi_state_t *state, char *string) {
|
|
|
qi_value_t *qi_make_bytes(qi_state_t *state, unsigned char *bytes,
|
|
|
qi_size_t size) {
|
|
|
qi_value_t *value;
|
|
|
- if (size == 0)
|
|
|
+ if (size == 0 || bytes == NULL)
|
|
|
return state->empty_bytes;
|
|
|
|
|
|
value = qi_make_value(QI_BYTES);
|
|
|
@@ -3747,6 +3747,18 @@ qi_value_t *qi_builtin_fopen(qi_state_t *state, qi_size_t pargc,
|
|
|
return qi_make_file(state, file, b->value.string);
|
|
|
}
|
|
|
|
|
|
+static unsigned char *_read_stdin(qi_size_t *count) {
|
|
|
+ *count = 0;
|
|
|
+
|
|
|
+ qi_buffer_t *buffer = qi_buffer_make();
|
|
|
+
|
|
|
+ char c;
|
|
|
+ while ((c = fgetc(stdin)) != EOF)
|
|
|
+ qi_buffer_append(buffer, c), (*count)++;
|
|
|
+
|
|
|
+ return (unsigned char *)qi_buffer_read(buffer);
|
|
|
+}
|
|
|
+
|
|
|
#define is_valid_read_mode(fmod) \
|
|
|
(strcmp((fmod), "a+") == 0 || strcmp((fmod), "r") == 0 || \
|
|
|
strcmp((fmod), "w+") == 0 || strcmp((fmod), "r+") == 0)
|
|
|
@@ -3772,6 +3784,13 @@ qi_value_t *qi_builtin_fread(qi_state_t *state, qi_size_t pargc,
|
|
|
|
|
|
qi_size_t size;
|
|
|
if (b->value.number < 0) {
|
|
|
+ if (a->value.file.fd == stdin) {
|
|
|
+ qi_size_t count;
|
|
|
+ unsigned char *data = _read_stdin(&count);
|
|
|
+
|
|
|
+ return qi_make_bytes(state, data, count);
|
|
|
+ }
|
|
|
+
|
|
|
fseek(a->value.file.fd, 0, SEEK_END);
|
|
|
size = ftell(a->value.file.fd);
|
|
|
fseek(a->value.file.fd, 0, SEEK_SET);
|