diff --git a/compiler/main.v b/compiler/main.v index b9125577c2..06e4e2a163 100644 --- a/compiler/main.v +++ b/compiler/main.v @@ -762,13 +762,19 @@ fn new_v(args[]string) *V { // Location of all vlib files mut lang_dir = '' // First try fetching it from VROOT if it's defined + for { // TODO tmp hack for optionals vroot_path := TmpPath + '/VROOT' if os.file_exists(vroot_path) { - vroot := os.read_file(vroot_path).trim_space() + mut vroot := os.read_file(vroot_path) or { + break + } + vroot=vroot.trim_space() if os.dir_exists(vroot) && os.dir_exists(vroot + '/builtin') { lang_dir = vroot } } + break + } // no "~/.vlang/VROOT" file, so the user must be running V for the first // time. if lang_dir == '' { diff --git a/compiler/scanner.v b/compiler/scanner.v index 720b8ec47a..782d42cd91 100644 --- a/compiler/scanner.v +++ b/compiler/scanner.v @@ -32,9 +32,13 @@ fn new_scanner(file_path string) *Scanner { if !os.file_exists(file_path) { panic('"$file_path" doesn\'t exist') } + text := os.read_file(file_path) or { + panic('scanner: failed to open "$file_path"') + return &Scanner{} + } scanner := &Scanner { file_path: file_path - text: os.read_file(file_path) + text: text fmt_out: new_string_builder(1000) } // println('new scanner "$file_path" txt.len=$scanner.text.len') diff --git a/os/os.v b/os/os.v index 5f21eb38c8..7a069137f2 100644 --- a/os/os.v +++ b/os/os.v @@ -41,22 +41,25 @@ fn parse_windows_cmd_line(cmd byteptr) { # os__args = vals; } +fn C.ftell(fp voidptr) int + // read_file reads the file in `path` and returns the contents. -// TODO return `?string` -pub fn read_file(path string) string { - res := '' - # FILE *f = fopen(path.str, "r"); - # if (!f) return tos("", 0); - # fseek(f, 0, SEEK_END); - # long fsize = ftell(f); - // # fseek(f, 0, SEEK_SET); //same as rewind(f); - # rewind(f); - # char *string = malloc(fsize + 1); - # fread(string, fsize, 1, f); - # fclose(f); - # string[fsize] = 0; - // # printf("RFILE= %s\n", string); - # res = tos(string, fsize); +pub fn read_file(path string) ?string { + mut res := '' + cpath := path.cstr() + fp := C.fopen(cpath, 'r') + if isnil(fp) { + return error('failed to open file "$path"') + } + C.fseek(fp, 0, SEEK_END) + fsize := C.ftell(fp) + // C.fseek(fp, 0, SEEK_SET) // same as C.rewind(fp) below + C.rewind(fp) + mut str := malloc(fsize + 1) + C.fread(str, fsize, 1, fp) + C.fclose(fp) + str[fsize] = 0 + res = tos(str, fsize) return res }