static int scan_archive(RcArchive rca) { if ( find_archive_dimensions(rca) ) { rc_member hdr; while( decode_member_header(rca, &hdr) && hdr.name ) rc_register_member(rca, &hdr); return TRUE; } return FALSE; }
static int register_header(RcArchive rca, rc_size hdrlen) { rc_member hdr; memset(&hdr, 0, sizeof(hdr)); hdr.name = strdup("$header"); hdr.rc_class = strdup("$rc"); hdr.encoding = strdup("none"); hdr.modified = time(NULL); hdr.size = hdrlen; hdr.offset = -(intptr_t)hdrlen; rc_register_member(rca, &hdr); return TRUE; }
static int scan_archive(RcArchive rca) { if ( find_archive_dimensions(rca) ) { const char *p = rca->data; while(p) { rc_member hdr; if ( (p = decode_member_header(rca, p, &hdr)) && hdr.name ) rc_register_member(rca, &hdr); } return TRUE; } return FALSE; }
RcObject rc_open(RcArchive rca, const char *name, const char *rcclass, int flags) { RcMember m = NULL; if ( (flags & RC_RDONLY) ) m = rc_find_member(rca, name, rcclass); else if ( (flags & RC_WRONLY) ) { rc_member hdr; memset(&hdr, 0, sizeof(hdr)); hdr.name = strdup(name); hdr.rc_class = strdup(rcclass); hdr.encoding = strdup("none"); hdr.file = NULL; hdr.size = 0; hdr.modified = time(NULL); rca->modified = TRUE; m = rc_register_member(rca, &hdr); } if ( m ) { RcObject o = malloc(sizeof(rc_object)); if ( o ) { o->member = m; o->offset = 0; o->data = NULL; } else rc_errno = RCE_ERRNO; return o; } return NULL; }
int rc_append_file(RcArchive rca, const char *name, const char *rcclass, const char *enc, const char *file) { rc_member hdr; struct stat buf; if ( stat(file, &buf) < 0 ) { rc_errno = RCE_ERRNO; return FALSE; /* cannot add */ } memset(&hdr, 0, sizeof(hdr)); hdr.name = strdup(name); hdr.rc_class = strdup(rcclass); hdr.encoding = strdup(enc); hdr.file = strdup(file); hdr.size = buf.st_size; hdr.modified = buf.st_mtime; rca->modified = TRUE; return rc_register_member(rca, &hdr) ? TRUE : FALSE; }