예제 #1
0
파일: dados.c 프로젝트: ricardoteles/ep3-SO
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

}
예제 #2
0
파일: dados.c 프로젝트: ricardoteles/ep3-SO
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;
}
예제 #3
0
파일: dados.c 프로젝트: ricardoteles/ep3-SO
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;
}
예제 #4
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;
}