txlyre 14 часов назад
Родитель
Сommit
8788debf2e
3 измененных файлов с 356 добавлено и 318 удалено
  1. 20 1
      qirt.c
  2. 333 317
      qistd.c
  3. 3 0
      std.qi

+ 20 - 1
qirt.c

@@ -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);

Разница между файлами не показана из-за своего большого размера
+ 333 - 317
qistd.c


+ 3 - 0
std.qi

@@ -46,6 +46,9 @@ func range(f) {
 let SEEK_SET = 0, SEEK_CUR = 1, SEEK_END = 2
 func frewind(file)
   return file.rewind()
+func read_stdin() {
+  return str(fread(STDIN, -1))
+}
 func file_read(filename) {
   let file = fopen(filename, "r")
   defer fclose(file)

Некоторые файлы не были показаны из-за большого количества измененных файлов