static File *file_new(Vis *vis, const char *filename) { if (filename) { /* try to detect whether the same file is already open in another window * TODO: do this based on inodes */ for (File *file = vis->files; file; file = file->next) { if (file->name && strcmp(file->name, filename) == 0) { return file; } } } Text *text = text_load(filename); if (!text && filename && errno == ENOENT) text = text_load(NULL); if (!text) return NULL; File *file = file_new_text(vis, text); if (!file) { text_free(text); return NULL; } if (filename) file->name = strdup(filename); if (!file->internal && vis->event && vis->event->file_open) vis->event->file_open(vis, file); return file; }
static File *file_new(Editor *ed, const char *filename) { if (filename) { /* try to detect whether the same file is already open in another window * TODO: do this based on inodes */ for (File *file = ed->files; file; file = file->next) { const char *name = text_filename_get(file->text); if (name && strcmp(name, filename) == 0) { file->refcount++; return file; } } } Text *text = text_load(filename); if (!text && filename && errno == ENOENT) text = text_load(NULL); if (!text) return NULL; if (filename) text_filename_set(text, filename); File *file = file_new_text(ed, text); if (!file) { text_free(text); return NULL; } return file; }
bool editor_window_new_fd(Editor *ed, int fd) { Text *text = text_load_fd(fd); if (!text) return false; File *file = file_new_text(ed, text); if (!file) { file_free(ed, file); return false; } Win *win = window_new_file(ed, file); if (!win) { file_free(ed, file); return false; } return true; }
static File *file_new(Vis *vis, const char *name) { char *name_absolute = NULL; if (name) { if (!(name_absolute = absolute_path(name))) return NULL; File *existing = NULL; /* try to detect whether the same file is already open in another window * TODO: do this based on inodes */ for (File *file = vis->files; file; file = file->next) { if (file->name && strcmp(file->name, name_absolute) == 0) { existing = file; break; } } if (existing) { free(name_absolute); return existing; } } File *file = NULL; Text *text = text_load(name); if (!text && name && errno == ENOENT) text = text_load(NULL); if (!text) goto err; if (!(file = file_new_text(vis, text))) goto err; file->name = name_absolute; if (!file->internal && vis->event && vis->event->file_open) vis->event->file_open(vis, file); return file; err: free(name_absolute); text_free(text); file_free(vis, file); return NULL; }