void view_close_cb (GtkWidget * widget, gpointer data) { SampleDisplay * sd = SAMPLE_DISPLAY(data); sw_view * v; v = sd->view; view_close(v); }
struct view *view_open(const char *path0) { struct view *view; struct text *text; struct stat statbuf; char *path = fix_path(path0); if (!path) return NULL; for (text = text_list; text; text = text->next) if (text->path && !strcmp(text->path, path)) { for (view = text->views; view; view = view->next) if (!view->window) goto done; view = view_create(text); goto done; } view = text_create(path, 0); text = view->text; errno = 0; if (stat(path, &statbuf)) { if (errno != ENOENT) { message("%s: can't stat", path_format(path)); goto fail; } if (read_only) { message("%s: can't create in read-only mode", path_format(path)); goto fail; } errno = 0; text->fd = open(path, O_CREAT|O_TRUNC|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); if (text->fd < 0) { message("%s: can't create", path_format(path)); goto fail; } text->flags |= TEXT_CREATED; } else { if (!S_ISREG(statbuf.st_mode)) { message("%s: not a regular file", path_format(path)); goto fail; } if (!read_only) text->fd = open(path, O_RDWR); if (text->fd < 0) { errno = 0; text->flags |= TEXT_RDONLY; text->fd = open(path, O_RDONLY); if (text->fd < 0) { message("%s: can't open", path_format(path)); goto fail; } } clean_mmap(text, statbuf.st_size, PROT_READ); if (!text->clean) { text->buffer = buffer_create(path); if (old_fashioned_read(text) < 0) goto fail; grab_mtime(text); } view->bytes = text->buffer ? buffer_bytes(text->buffer) : text->clean_bytes; scan(view); text_forget_undo(text); } goto done; fail: view_close(view); view = NULL; done: RELEASE(path); return view; }