void criaSuperBloco() { iniSuperbloco = 0; iniBitmap = TAM_BLOCO; iniFat = 2 * TAM_BLOCO; raiz = setStruct("/\0", (int)(iniFat + TAM_FAT), data(), data(), data(), -1); memUsada = NUM_ARQ_DIR; qtadeBlocos = (TAM_FS - raiz.byteInicio)/TAM_BLOCO; qtadeBlocosLivres = qtadeBlocos - 1; qteDiretorios = 0; qteArquivos = 0; espacoLivre = (TAM_FS - raiz.byteInicio) - memUsada; espacoDesperd = (qtadeBlocos - qtadeBlocosLivres) * TAM_BLOCO - memUsada; escreveInt(arquivo, 0, 0, TAM_BLOCO); // preenche com zero escreveInt(arquivo, qtadeBlocos, 0 , 1); // escreve numero de blocos totais escreveInt(arquivo, qtadeBlocosLivres, 4 , 1); // escreve # blocos livres escreveInt(arquivo, memUsada, 8 , 1); // escreve mem. utilizada escreveInt(arquivo, qteDiretorios, 12, 1); // escreve qte diretorios escreveInt(arquivo, qteArquivos, 16, 1); // escreve qte arquivos escreveInt(arquivo, espacoLivre, 20, 1); // escreve espaco livre escreveInt(arquivo, espacoDesperd, 24, 1); // escreve espaco desperdicado escreveInt(arquivo, iniBitmap, 28, 1); // escreve inicio bitmap escreveInt(arquivo, iniFat, 32, 1); // escreve inicio FAT escreveStruct(arquivo, raiz, 36, 1); // escreve entrada da raiz }
int mkdir(char* path) { char nome[20]; Arquivo novo; int endEntry; numNiveis = parserPath(path); percorreArvoreFS(); strcpy(nome, matrizPath[numNiveis-1]); novo = setStruct(nome, 0, data(), data(), data(), -1); endEntry = insereEntradaEmDiretorio(&novo); if (endEntry) { escreveStruct(arquivo, novo, endEntry, 1); alocaDiretorio(novo.byteInicio); memUsada += (NUM_ARQ_DIR + sizeof(Arquivo)); escreveInt(arquivo, memUsada, 8, 1); qteDiretorios++; escreveInt(arquivo, qteDiretorios, 12, 1); return 1; } return 0; }
int touch(char* path) { char nome[20]; Arquivo novo; int endEntry; int endFinal; numNiveis = parserPath(path); percorreArvoreFS(); // existe ou não o arquivo ? endFinal = buscaEntradaEmDiretorio(matrizPath[numNiveis-1], mapsBlockToFAT(addressBlock[numNiveis-1]), addressBlock[numNiveis-1], &novo); if (endFinal < 0) { // se arquivo nao existe strcpy(nome, matrizPath[numNiveis-1]); novo = setStruct(nome, 0, data(), data(), data(), 0); endEntry = insereEntradaEmDiretorio(&novo); if (endEntry) { escreveStruct(arquivo, novo, endEntry, 1); qteArquivos++; escreveInt(arquivo, qteArquivos, 16, 1); alocaArquivo(novo.byteInicio); memUsada += sizeof(Arquivo); escreveInt(arquivo, memUsada, 8, 1); return endEntry; } } else { strcpy(novo.tempoAcessado, data()); escreveStruct(arquivo, novo, endEntry, 1); return 1; } return 0; }
bool CLuaBinary::setStruct(luabridge::LuaRef objVal, luabridge::LuaRef objAttr) { assert(objVal.isTable()); assert(objAttr.isTable()); bool bOk = false; DataType emType; int iSize = Q_INIT_NUMBER; std::string strName; for (int i = 1; i <= objAttr.length(); i++) { luabridge::LuaRef objTmp = objAttr[i]; if (!objTmp.isTable() || STATTRTAB_MINLENS > objTmp.length()) { return false; } luabridge::LuaRef objChildStAttr = getStructAttr(objTmp, strName, emType, iSize); luabridge::LuaRef objFieldVal = objVal[strName]; switch(emType) { case DTYPE_SINT8: { bOk = setSint8(getLuaNumber<short>(objFieldVal)); } break; case DTYPE_UINT8: { bOk = setUint8(getLuaNumber<unsigned short>(objFieldVal)); } break; case DTYPE_BOOL: { bOk = setBool(((Q_INIT_NUMBER != getLuaNumber<unsigned short>(objFieldVal)) ? true : false)); } break; case DTYPE_SINT16: { bOk = setSint16(getLuaNumber<short>(objFieldVal)); } break; case DTYPE_UINT16: { bOk = setUint16(getLuaNumber<unsigned short>(objFieldVal)); } break; case DTYPE_SINT32: { bOk = setSint32(getLuaNumber<int>(objFieldVal)); } break; case DTYPE_UINT32: { bOk = setUint32(getLuaNumber<unsigned int>(objFieldVal)); } break; case DTYPE_SINT64: { bOk = setSint64(Q_ToString(getLuaNumber<int64_t>(objFieldVal)).c_str()); } break; case DTYPE_UINT64: { bOk = setUint64(Q_ToString(getLuaNumber<uint64_t>(objFieldVal)).c_str()); } break; case DTYPE_FLOAT: { bOk = setFloat(getLuaNumber<float>(objFieldVal)); } break; case DTYPE_DOUBLE: { bOk = setDouble(getLuaNumber<double>(objFieldVal)); } break; case DTYPE_STRING: { if (!objFieldVal.isString()) { bOk = false; break; } const char *pszVal = objFieldVal.cast<const char*>(); if (objFieldVal.length() >= iSize) { bOk = false; Q_Printf("%s", "data len too large."); break; } bOk = setString(pszVal); if (bOk) { bOk = skipWrite(iSize - (objFieldVal.length() + 1)); } } break; case DTYPE_BYTE: { if (!objFieldVal.isString()) { bOk = false; break; } const char *pszVal = objFieldVal.cast<const char*>(); if (objFieldVal.length() > iSize) { bOk = false; Q_Printf("%s", "data len too large."); break; } bOk = setByte(pszVal, objFieldVal.length()); if (bOk) { bOk = skipWrite(iSize - objFieldVal.length()); } } break; case DTYPE_STRUCT: { if (!objFieldVal.isTable() || !objChildStAttr.isTable()) { bOk = false; break; } bOk = setStruct(objFieldVal, objChildStAttr); } break; case DTYPE_SKIP: { if (iSize > Q_INIT_NUMBER) { bOk = skipWrite(iSize); } } break; default: bOk = false; break; } if (!bOk) { return bOk; } } return true; }