/** file_contents : f:string -> string <doc>Read the content of the file [f] and return it.</doc> **/ static value file_contents( value name ) { buffer s; int len; int p; val_check(name,string); fio f(val_filename(name)); const char *fname = val_string(name); gc_enter_blocking(); f.io = fopen(fname,"rb"); if( f.io == NULL ) file_error("file_contents",&f); fseek(f.io,0,SEEK_END); len = ftell(f.io); fseek(f.io,0,SEEK_SET); gc_exit_blocking(); s = alloc_buffer_len(len); p = 0; gc_enter_blocking(); while( len > 0 ) { int d; POSIX_LABEL(file_contents); d = (int)fread((char*)buffer_data(s)+p,1,len,f.io); if( d <= 0 ) { HANDLE_FINTR(f.io,file_contents); fclose(f.io); file_error("file_contents",&f); } p += d; len -= d; } fclose(f.io); gc_exit_blocking(); return buffer_val(s); }
/** file_read : 'file -> s:string -> p:int -> l:int -> int <doc> Read up to [l] chars into the string [s] starting at position [p]. Returns the number of chars readed which is > 0 (or 0 if l == 0). </doc> **/ static value file_read( value o, value s, value pp, value n ) { fio *f; int p; int len; int buf_len; val_check_kind(o,k_file); val_check(s,buffer); buffer buf = val_to_buffer(s); buf_len = buffer_size(buf); val_check(pp,int); val_check(n,int); f = val_file(o); p = val_int(pp); len = val_int(n); if( p < 0 || len < 0 || p > buf_len || p + len > buf_len ) return alloc_null(); gc_enter_blocking(); while( len > 0 ) { int d; POSIX_LABEL(file_read_again); d = (int)fread(buffer_data(buf)+p,1,len,f->io); if( d <= 0 ) { int size = val_int(n) - len; HANDLE_FINTR(f->io,file_read_again); if( size == 0 ) file_error("file_read",f); return alloc_int(size); } p += d; len -= d; } gc_exit_blocking(); return n; }
/** file_contents : f:string -> string <doc>Read the content of the file [f] and return it.</doc> **/ String _hx_std_file_contents_string( String name ) { std::vector<char> buffer; hx::EnterGCFreeZone(); FILE *file = fopen(name.__s, "rb"); if(!file) file_error("file_contents",name); fseek(file,0,SEEK_END); int len = ftell(file); if (len<0) file_error("file_ftell",name); fseek(file,0,SEEK_SET); buffer.resize(len); int p = 0; while( len > 0 ) { POSIX_LABEL(file_contents); int d = (int)fread(&buffer[p],1,len,file); if( d <= 0 ) { HANDLE_FINTR(file,file_contents); fclose(file); file_error("file_contents",name); } p += d; len -= d; } fclose(file); hx::ExitGCFreeZone(); return String(&buffer[0], buffer.size()).dup(); }
/** file_write : 'file -> s:string -> p:int -> l:int -> int <doc> Write up to [l] chars of string [s] starting at position [p]. Returns the number of chars written which is >= 0. </doc> **/ int _hx_std_file_write( Dynamic handle, Array<unsigned char> s, int p, int n ) { fio *f = getFio(handle); int buflen = s->length; int len = n; if( p < 0 || len < 0 || p > buflen || p + len > buflen ) return 0; hx::EnterGCFreeZone(); while( len > 0 ) { POSIX_LABEL(file_write_again); int d = (int)fwrite(&s[p],1,len,f->io); if( d <= 0 ) { HANDLE_FINTR(f->io,file_write_again); file_error("file_write",f->name); } p += d; len -= d; } hx::ExitGCFreeZone(); return n; }
/** file_read : 'file -> s:string -> p:int -> l:int -> int <doc> Read up to [l] chars into the string [s] starting at position [p]. Returns the number of chars readed which is > 0 (or 0 if l == 0). </doc> **/ int _hx_std_file_read( Dynamic handle, Array<unsigned char> buf, int p, int n ) { fio *f = getFio(handle); int buf_len = buf->length; int len = n; if( p < 0 || len < 0 || p > buf_len || p + len > buf_len ) return 0; hx::EnterGCFreeZone(); // Attempt to increase the chances of pinning on the stack... unsigned char *bufPtr = &buf[0]; while( len > 0 ) { POSIX_LABEL(file_read_again); int d = (int)fread(bufPtr + p,1,len,f->io); if( d <= 0 ) { int size = n - len; HANDLE_FINTR(f->io,file_read_again); if( size == 0 ) file_error("file_read",f->name); hx::ExitGCFreeZone(); return size; } p += d; len -= d; } hx::ExitGCFreeZone(); return n; }
/** file_write : 'file -> s:string -> p:int -> l:int -> int <doc> Write up to [l] chars of string [s] starting at position [p]. Returns the number of chars written which is >= 0. </doc> **/ static value file_write( value o, value s, value pp, value n ) { int p, len; fio *f; val_check_kind(o,k_file); val_check(s,string); val_check(pp,int); val_check(n,int); f = val_file(o); p = val_int(pp); len = val_int(n); if( p < 0 || len < 0 || p > val_strlen(s) || p + len > val_strlen(s) ) neko_error(); while( len > 0 ) { int d; POSIX_LABEL(file_write_again); d = (int)fwrite(val_string(s)+p,1,len,f->io); if( d <= 0 ) { HANDLE_FINTR(f->io,file_write_again); file_error("file_write",f); } p += d; len -= d; } return n; }
/** file_contents : f:string -> string <doc>Read the content of the file [f] and return it.</doc> **/ static value file_contents( value name ) { value s; fio f; int len; int p; val_check(name,string); f.name = name; f.io = fopen(val_string(name),"rb"); if( f.io == NULL ) file_error("file_contents",&f); fseek(f.io,0,SEEK_END); len = ftell(f.io); fseek(f.io,0,SEEK_SET); s = alloc_empty_string(len); p = 0; while( len > 0 ) { int d; POSIX_LABEL(file_contents); d = (int)fread((char*)val_string(s)+p,1,len,f.io); if( d <= 0 ) { HANDLE_FINTR(f.io,file_contents); fclose(f.io); file_error("file_contents",&f); } p += d; len -= d; } fclose(f.io); return s; }
/** file_read : 'file -> s:string -> p:int -> l:int -> int <doc> Read up to [l] chars into the string [s] starting at position [p]. Returns the number of chars readed which is > 0 (or 0 if l == 0). </doc> **/ static value file_read( value o, value s, value pp, value n ) { fio *f; int p; int len; val_check_kind(o,k_file); val_check(s,string); val_check(pp,int); val_check(n,int); f = val_file(o); p = val_int(pp); len = val_int(n); if( p < 0 || len < 0 || p > val_strlen(s) || p + len > val_strlen(s) ) neko_error(); while( len > 0 ) { int d; POSIX_LABEL(file_read_again); d = (int)fread((char*)val_string(s)+p,1,len,f->io); if( d <= 0 ) { int size = val_int(n) - len; HANDLE_FINTR(f->io,file_read_again); if( size == 0 ) file_error("file_read",f); return alloc_int(size); } p += d; len -= d; } return n; }
/** file_read_char : 'file -> int <doc>Read a char from the file. Exception on error</doc> **/ static value file_read_char( value o ) { unsigned char cc; fio *f; val_check_kind(o,k_file); f = val_file(o); POSIX_LABEL(read_char_again); if( fread(&cc,1,1,f->io) != 1 ) { HANDLE_FINTR(f->io,read_char_again); file_error("file_read_char",f); } return alloc_int(cc); }
/** file_read_char : 'file -> int <doc>Read a char from the file. Exception on error</doc> **/ int _hx_std_file_read_char( Dynamic handle ) { fio *f = getFio(handle); unsigned char cc = 0; hx::EnterGCFreeZone(); POSIX_LABEL(read_char_again); if( fread(&cc,1,1,f->io) != 1 ) { HANDLE_FINTR(f->io,read_char_again); file_error("file_read_char",f->name); } hx::ExitGCFreeZone(); return cc; }
/** file_write_char : 'file -> c:int -> void <doc>Write the char [c]. Error if [c] outside of the range 0..255</doc> **/ void _hx_std_file_write_char( Dynamic handle, int c ) { fio *f = getFio(handle); if( c < 0 || c > 255 ) return; char cc = (char)c; hx::EnterGCFreeZone(); POSIX_LABEL(write_char_again); if( fwrite(&cc,1,1,f->io) != 1 ) { HANDLE_FINTR(f->io,write_char_again); file_error("file_write_char",f->name); } hx::ExitGCFreeZone(); }
/** file_write_char : 'file -> c:int -> void <doc>Write the char [c]. Error if [c] outside of the range 0..255</doc> **/ static value file_write_char( value o, value c ) { unsigned char cc; fio *f; val_check(c,int); val_check_kind(o,k_file); if( val_int(c) < 0 || val_int(c) > 255 ) neko_error(); cc = (char)val_int(c); f = val_file(o); POSIX_LABEL(write_char_again); if( fwrite(&cc,1,1,f->io) != 1 ) { HANDLE_FINTR(f->io,write_char_again); file_error("file_write_char",f); } return val_null; }
/** file_write_char : 'file -> c:int -> void <doc>Write the char [c]. Error if [c] outside of the range 0..255</doc> **/ static value file_write_char( value o, value c ) { unsigned char cc; fio *f; val_check(c,int); val_check_kind(o,k_file); if( val_int(c) < 0 || val_int(c) > 255 ) return alloc_null(); cc = (char)val_int(c); f = val_file(o); gc_enter_blocking(); POSIX_LABEL(write_char_again); if( fwrite(&cc,1,1,f->io) != 1 ) { HANDLE_FINTR(f->io,write_char_again); file_error("file_write_char",f); } gc_exit_blocking(); return alloc_bool(true); }
/** file_contents : f:string -> string <doc>Read the content of the file [f] and return it.</doc> **/ Array<unsigned char> _hx_std_file_contents_bytes( String name ) { hx::EnterGCFreeZone(); FILE *file = fopen(name.__s, "rb"); if(!file) file_error("file_contents",name); fseek(file,0,SEEK_END); int len = ftell(file); if (len<0) file_error("file_ftell",name); fseek(file,0,SEEK_SET); hx::ExitGCFreeZone(); Array<unsigned char> buffer = Array_obj<unsigned char>::__new(len,len); hx::EnterGCFreeZone(); if (len) { char *dest = (char *)&buffer[0]; hx::EnterGCFreeZone(); int p = 0; while( len > 0 ) { POSIX_LABEL(file_contents1); int d = (int)fread(dest + p,1,len,file); if( d <= 0 ) { HANDLE_FINTR(file,file_contents1); fclose(file); file_error("file_contents",name); } p += d; len -= d; } } fclose(file); hx::ExitGCFreeZone(); return buffer; }