Exemplo n.º 1
0
/* 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;
  }
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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;
    }
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}