Esempio n. 1
0
static void ParseConfig (void)
/* Parse the config file */
{
    static const IdentTok BlockNames [] = {
	{   "MEMORY",  	CFGTOK_MEMORY	},
	{   "FILES",    CFGTOK_FILES    },
        {   "SEGMENTS", CFGTOK_SEGMENTS },
	{   "FORMATS", 	CFGTOK_FORMATS  },
	{   "FEATURES", CFGTOK_FEATURES	},
	{   "SYMBOLS",	CFGTOK_SYMBOLS 	},
    };
    cfgtok_t BlockTok;

    do {

	/* Read the block ident */
       	CfgSpecialToken (BlockNames, ENTRY_COUNT (BlockNames), "Block identifier");
	BlockTok = CfgTok;
	CfgNextTok ();

	/* Expected a curly brace */
	CfgConsume (CFGTOK_LCURLY, "`{' expected");

	/* Read the block */
	switch (BlockTok) {

	    case CFGTOK_MEMORY:
	     	ParseMemory ();
	     	break;

	    case CFGTOK_FILES:
	     	ParseFiles ();
	     	break;

	    case CFGTOK_SEGMENTS:
	     	ParseSegments ();
	     	break;

	    case CFGTOK_FORMATS:
	     	ParseFormats ();
	     	break;

	    case CFGTOK_FEATURES:
		ParseFeatures ();
		break;

	    case CFGTOK_SYMBOLS:
		ParseSymbols ();
		break;

	    default:
	     	FAIL ("Unexpected block token");

	}

	/* Skip closing brace */
	CfgConsume (CFGTOK_RCURLY, "`}' expected");

    } while (CfgTok != CFGTOK_EOF);
}
Esempio n. 2
0
void PHPParserThread::ProcessRequest(ThreadRequest* request)
{
    PHPParserThreadRequest* r = dynamic_cast<PHPParserThreadRequest*>(request);
    if(r) {
        switch(r->requestType) {
        case PHPParserThreadRequest::kParseWorkspaceFilesFull:
        case PHPParserThreadRequest::kParseWorkspaceFilesQuick:
            ParseFiles(r);
            break;
        case PHPParserThreadRequest::kParseSingleFile:
            ParseFile(r);
            break;
        }
    }
}
int main(int argc, char **argv)
{
	FILE *outfile = NULL;
	unsigned char *vars = NULL, *vars1 = NULL, *vars2 = NULL, *vars3 = NULL;
	int varsLen = 0, vars1Len = 0, vars2Len = 0, vars3Len = 0;
	int varsCount = 0, vars1Count = 0, vars2Count = 0, vars3Count = 0;
	int i = 0, x = 0, compression = 0;
	
	setlocale(LC_ALL,"Japanese");
	
	if(argc<3)
	{
		printf("usage: %s infolder outpck [-c/-e]\n\nFlags:\n-c = Compression mode. A little slow but all files will be compressed.\n-e = Extra encryption (required for scripts)",argv[0]);
		return 0;
	}
	
	pckhead.extraencrypt = 0;
	for(i = 3; i < argc; i++)
	{
		if(strcmp(argv[i],"-c") == 0)
			compression = 1;
		else if(strcmp(argv[i],"-e") == 0)
			pckhead.extraencrypt = 1;
	}
	
	ParseDir(argv[1]);
	vars = GetBuffer("vars.dat", argv[1], &varsLen, &varsCount);
	vars1 = GetBuffer("vars1.dat", argv[1], &vars1Len, &vars1Count);
	vars2 = GetBuffer("vars2.dat", argv[1], &vars2Len, &vars2Count);
	vars3 = GetBuffer("vars3.dat", argv[1], &vars3Len, &vars3Count);
	
	pckhead.headersize = 0x5c;
	pckhead.table1.size = pckhead.globalvartable.size = pckhead.globalvartablestr.size = varsCount;
	(int)pckhead.table1.buffer = 0x5c;
	(int)pckhead.globalvartable.buffer = (int)pckhead.table1.buffer+varsCount*8;
	(int)pckhead.globalvartablestr.buffer = (int)pckhead.globalvartable.buffer+varsCount*8;
	(int)pckhead.filenametable1.buffer = varsLen+pckhead.headersize;
	(int)pckhead.filenametable1.size = vars1Count;
	(int)pckhead.filenametable2.buffer = pckhead.filenametable1.buffer+vars1Len;
	(int)pckhead.filenametable2.size = vars2Count;
	(int)pckhead.filenametable3.buffer = pckhead.filenametable2.buffer+vars2Len;
	(int)pckhead.filenametable3.size = vars3Count;
	(int)pckhead.filenametable4.buffer = pckhead.filenametable3.buffer+vars3Len;
	pckhead.filenametable4.size = pckhead.filenamestr.size = pckhead.filetable.size = pckhead.filestart.size = filecount;
	(int)pckhead.filenamestr.buffer = (int)pckhead.filenametable4.buffer+pckhead.filenametable4.size*8;
	(int)pckhead.filetable.buffer = (int)pckhead.filenamestr.buffer+(wcslen(filenamebuff)*2);
	(int)pckhead.filestart.buffer = (int)pckhead.filetable.buffer+pckhead.filetable.size*8;
	pckhead.unk2 = 0x366;
	
	outfile = fopen(argv[2],"wb+");
	
	// quick hackish way to do this without having to duplicate code or do a bunch of stuff
	// on the first pass, write all of the file information so the space will be there and
	// then write the file data (compressed or otherwise) and count the totals
	// on the second pass only rewrite the file information which will this time be correct
	
	for(x = 0; x < 2; x++)
	{
		fwrite(&pckhead,1,sizeof(pckhead),outfile);
		fwrite(vars,1,varsLen,outfile);
		fwrite(vars1,1,vars1Len,outfile);
		fwrite(vars2,1,vars2Len,outfile);
		fwrite(vars3,1,vars3Len,outfile);
		//fwrite(&fileinfo,sizeof(FileEntry),filecount,outfile);
	
		for(i=0; i<filecount; i++)
		{
			fwrite(&fileinfo[i].nameoffset,1,4,outfile);
			fwrite(&fileinfo[i].namesize,1,4,outfile);
		}
		
		fwrite(filenamebuff,2,wcslen(filenamebuff),outfile);
		
		for(i=0; i<filecount; i++)
		{
			fwrite(&fileinfo[i].offset,1,4,outfile);
			fwrite(&fileinfo[i].size,1,4,outfile);
		}
	
		if(x == 0)
		{
			ParseFiles(outfile,argv[1],compression);
			
			fclose(outfile);
			outfile = fopen(argv[2],"rb+");
		}
	}
	
	fclose(outfile);
	
	return 0;
}