/* * Open file 'fname', in mode 'mode', with filetype 'ftype'. * Returns file handle or NULL. */ ang_file *file_open(const char *fname, file_mode mode, file_type ftype) { ang_file *f = ZNEW(ang_file); char buf[1024]; (void)ftype; /* Get the system-specific path */ path_parse(buf, sizeof(buf), fname); switch (mode) { case MODE_WRITE: f->fh = fopen(buf, "wb"); break; case MODE_READ: f->fh = fopen(buf, "rb"); break; case MODE_APPEND: f->fh = fopen(buf, "a+"); break; default: f->fh = fopen(buf, "__"); } if (f->fh == NULL) { FREE(f); return NULL; } f->fname = string_make(buf); f->mode = mode; if (mode != MODE_READ && file_open_hook) file_open_hook(buf, ftype); return f; }
/* * Open file 'fname', in mode 'mode', with filetype 'ftype'. * Returns file handle or NULL. */ ang_file *file_open(const char *fname, file_mode mode, file_type ftype) { ang_file *f = ZNEW(ang_file); char buf[1024]; (void)ftype; /* Get the system-specific path */ path_parse(buf, sizeof(buf), fname); switch (mode) { case MODE_WRITE: { if (ftype == FTYPE_SAVE) { /* open only if the file does not exist */ int fd; fd = open(buf, O_CREAT | O_EXCL | O_WRONLY | O_BINARY, S_IRUSR | S_IWUSR); if (fd < 0) { /* there was some error */ f->fh = NULL; } else { f->fh = fdopen(fd, "wb"); } } else { f->fh = fopen(buf, "wb"); } break; } case MODE_READ: f->fh = fopen(buf, "rb"); break; case MODE_APPEND: f->fh = fopen(buf, "a+"); break; default: assert(0); } if (f->fh == NULL) { FREE(f); return NULL; } f->fname = string_make(buf); f->mode = mode; if (mode != MODE_READ && file_open_hook) file_open_hook(buf, ftype); return f; }