/* 1. When called repeatedly on the same TBuffer, its existing data is discarded and overwritten by the new data. 2. The TBuffer's array is never shrunk by this function. */ void bufferZ_putrepstring (TBuffer *BufRep, int reppos, int nsub) { char dbuf[] = { 0, 0 }; size_t replen; const char *p = lua_tolstring (BufRep->L, reppos, &replen); const char *end = p + replen; BufRep->top = 0; while (p < end) { const char *q; for (q = p; q < end && *q != '%'; ++q) {} if (q != p) bufferZ_addlstring (BufRep, p, q - p); if (q < end) { if (++q < end) { /* skip % */ if (isdigit (*q)) { int num; *dbuf = *q; num = strtol (dbuf, NULL, 10); if (num == 1 && nsub == 0) num = 0; else if (num > nsub) { freelist_free (BufRep->freelist); luaL_error (BufRep->L, "invalid capture index"); } bufferZ_addnum (BufRep, num); } else bufferZ_addlstring (BufRep, q, 1); } p = q + 1; } else break; } }
void buffer_init (TBuffer *buf, size_t sz, lua_State *L, TFreeList *fl) { void *ud; lua_Alloc lalloc = lua_getallocf(L, &ud); buf->arr = (char*) lalloc (ud, NULL, 0, sz); if (!buf->arr) { freelist_free (fl); luaL_error (L, "malloc failed"); } buf->size = sz; buf->top = 0; buf->L = L; buf->freelist = fl; freelist_add (fl, buf); }
void fs_free(FileSystem **fs) { if (fs && *fs) { int i = 0; for (i = 0; i < (*fs)->ninode; ++i) { fs_save_inode(*fs, (*fs)->inodes[i]); free((*fs)->inodes[i]); } (*fs)->ninode = 0; freelist_free((*fs)->freelist); (*fs)->freelist = NULL; free(*fs); *fs = NULL; } }
void buffer_addlstring (TBuffer *buf, const void *src, size_t sz) { size_t newtop = buf->top + sz; if (newtop > buf->size) { void *ud; lua_Alloc lalloc = lua_getallocf(buf->L, &ud); char *p = (char*) lalloc (buf->L, buf->arr, buf->size, 2 * newtop); /* 2x expansion */ if (!p) { freelist_free (buf->freelist); luaL_error (buf->L, "realloc failed"); } buf->arr = p; buf->size = 2 * newtop; } if (src) memcpy (buf->arr + buf->top, src, sz); buf->top = newtop; }
int fs_format(FileSystem *fs) { int i = 0; int sec = 0; char buffer[256] = ""; for (i = 0; i < fs->ninode; ++i) { fs_save_inode(fs, fs->inodes[i]); free(fs->inodes[i]); } fs->ninode = 0; freelist_free(fs->freelist); fs->freelist = NULL; for (sec = 0; sec < FREELIST_NSEC(); ++sec) { for (i = 0; i < 256 / 4; ++i) { storage_writeint(fs->stor, sec, i * 4, 0); } } storage_writeint(fs->stor, ROOT_PAGE_NUM(), 0, INODE_FOLDER); storage_writeint(fs->stor, ROOT_PAGE_NUM(), 4, 43); storage_writelong(fs->stor, ROOT_PAGE_NUM(), 8, time(NULL)); storage_writeint(fs->stor, ROOT_PAGE_NUM(), 16, ROOT_PAGE_NUM() + 1); storage_writeint(fs->stor, ROOT_PAGE_NUM(), CONTENT_BYTES_PER_PAGE, INODE_MAGIC_NUMBER); util_writeint(buffer, 0, 3); // first item "" util_writesize(buffer, 4, 0); util_writeint(buffer, 12, ROOT_PAGE_NUM()); // second item "." util_writesize(buffer, 16, 1); buffer[24] = '.'; util_writeint(buffer, 25, ROOT_PAGE_NUM()); // third item ".." util_writesize(buffer, 29, 2); buffer[37] = '.'; buffer[38] = '.'; util_writeint(buffer, 39, ROOT_PAGE_NUM()); storage_writepage(fs->stor, ROOT_PAGE_NUM() + 1, buffer); fs->freelist = freelist_new(fs); fs->cur = fs_load_inode(fs, ROOT_PAGE_NUM()); return OK; }