1.1 --- a/templates/native.c Tue Dec 06 22:30:20 2016 +0100
1.2 +++ b/templates/native.c Tue Dec 06 22:39:23 2016 +0100
1.3 @@ -675,6 +675,59 @@
1.4 }
1.5 }
1.6
1.7 +__attr __fn_native__fread(__attr __args[])
1.8 +{
1.9 + __attr * const fp = &__args[1];
1.10 + __attr * const size = &__args[2];
1.11 + /* fp interpreted as FILE reference */
1.12 + FILE *f = (FILE *) fp->datavalue;
1.13 + /* size.__data__ interpreted as int */
1.14 + int to_read = __load_via_object(size->value, __pos___data__).intvalue;
1.15 + char buf[to_read];
1.16 + size_t have_read;
1.17 + int error;
1.18 + char *s;
1.19 +
1.20 + have_read = fread(buf, sizeof(char), to_read, f);
1.21 +
1.22 + if (have_read != to_read)
1.23 + {
1.24 + if (feof(f))
1.25 + __raise_eof_error();
1.26 + else if (error = ferror(f))
1.27 + __raise_io_error(__new_int(error));
1.28 + }
1.29 +
1.30 + /* Reserve space for a new string. */
1.31 +
1.32 + s = __ALLOCATE(have_read + 1, sizeof(char));
1.33 + strncpy(s, (char *) buf, have_read); /* does not null terminate but final byte should be zero */
1.34 + return __new_str(s);
1.35 +}
1.36 +
1.37 +__attr __fn_native__fwrite(__attr __args[])
1.38 +{
1.39 + __attr * const fp = &__args[1];
1.40 + __attr * const str = &__args[2];
1.41 + /* fp interpreted as FILE reference */
1.42 + FILE *f = (FILE *) fp->datavalue;
1.43 + /* str.__data__ interpreted as string */
1.44 + char *s = __load_via_object(str->value, __pos___data__).strvalue;
1.45 + size_t to_write = strlen(s);
1.46 + size_t have_written = fwrite(s, sizeof(char), to_write, f);
1.47 + int error;
1.48 +
1.49 + if (have_written != to_write)
1.50 + {
1.51 + if (feof(f))
1.52 + __raise_eof_error();
1.53 + else if (error = ferror(f))
1.54 + __raise_io_error(__new_int(error));
1.55 + }
1.56 +
1.57 + return __builtins___none_None;
1.58 +}
1.59 +
1.60 __attr __fn_native__read(__attr __args[])
1.61 {
1.62 __attr * const fd = &__args[1];
1.63 @@ -695,6 +748,7 @@
1.64 else
1.65 {
1.66 /* Reserve space for a new string. */
1.67 +
1.68 s = __ALLOCATE(have_read + 1, 1);
1.69 strncpy(s, (char *) buf, have_read); /* does not null terminate but final byte should be zero */
1.70 return __new_str(s);