[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: iniciacion en scripting...




Un poco fuera de tema...
acabo de hacer un parser en C, para archivos tipo .ini, que son mas o menos asi:
[seccion]
variable = valor
otra variable = otro valor

Esta un tanto especializado, pero se puede usar de ejemplo.
Si a alguen le sirve, me mocho...


Suena interesante. ¿Quizá ponerlo a disposición en la red?
Na, esta muy crudo...
En este ejemplo, tengo que parsear un archivo que tiene un [Global]
y varias secciones de "destinos". Tiene que almacenar varias variables descritas en la seccion global, y agregar "destinos" a una lista ligada (lo hace mediante funciones, no escribiendo en la variable directamente)
En fin, se puede dar una idea uno...
Tal vez, en cuanto termine mi proyecto (donde uso esta cosa) publicare en algun lado una libreria de parseo generica.


--
Alexander aka alk[ anoide | olico | ulero | ero | atraz]
(mi matrializacion es fisica, mi escencia es matematica)
//look for a ini file, if such, parse it
FILE* iniFile;
//temporal storage
char* currentLine;
char* param;
char* value;
//temporal storage of the destination data
char* tmpDestID;
char* tmpDestHost;
bool  tmpDestPASV;
char* tmpDestUser;
char* tmpDestPass;
char* tmpDestUpld;
char* tmpDestNotf;
int lineSize = 80; //maybe more (:
char c;
bool inGlobal = FALSE;
currentLine = (char*)malloc(lineSize+1);
param = (char*)malloc(lineSize+1);
value = (char*)malloc(lineSize+1);
strcpy(currentLine, "");
strcpy(param, "");
strcpy(value, "");
tmpDestID   = (char*)malloc(lineSize+1);
tmpDestHost = (char*)malloc(lineSize+1);
tmpDestUser = (char*)malloc(lineSize+1);
tmpDestPass = (char*)malloc(lineSize+1);
tmpDestUpld = (char*)malloc(lineSize+1);
tmpDestNotf = (char*)malloc(lineSize+1);
strcpy(tmpDestID,  "");
tmpDestPASV = TRUE;
strcpy(tmpDestHost,"");
strcpy(tmpDestUser,"");
strcpy(tmpDestPass,"");
strcpy(tmpDestUpld,"");
strcpy(tmpDestNotf,"");
if(iniFile = fopen(iniFileName, "r")) //attempt to open the ini file
{
	report("ini file found, parsing...");
	while( (c=getc(iniFile)) != EOF) //while not at the end of the file yet
	{
		free(currentLine); //reset currentLine storage location
		currentLine = (char*)malloc(lineSize+1);
		strcpy(currentLine, "");
		while(c != '\n') //while the end of the line is not reached yet
		{
			if((int)strlen(currentLine) <= lineSize) //if there is space to keep writing in the current line
				strncat(currentLine, &c, 1); //append the character to the line
			if( (c=getc(iniFile)) == EOF) break; //if the next character is EOF, end the loop
		}
		free(param); //reset param and valie storage locations
		free(value);
		param = (char*)malloc(lineSize+1);
		value = (char*)malloc(lineSize+1);
		strcpy(param, "");
		strcpy(value, "");
		while(isspace(*currentLine) && *currentLine != '\0') ++currentLine; //strip whitespaces from the beginnig
		while(isspace(*(currentLine + strlen(currentLine) - 1 )) && strlen(currentLine) != 0)  *(currentLine + strlen(currentLine) - 1) = '\0'; //strip whitespaces from the end
		//proceed to parse the line
		if(
			*currentLine != '[' //it has no "[" at the beginning
			&& strchr(currentLine, '=') != NULL //there is a "=" in the string
			&& strchr(currentLine, '=') != currentLine //it's not at the beginnign
			&& strchr(currentLine, '=') != currentLine + strlen(currentLine) - 1 //nethier at the end
			) //so it's a valid parameter=value line
		{
			//assign data to temporal storage
			strcpy(param, strtok(currentLine, "=") );
			strcpy(value, strtok(NULL       , "=") );
			//strip whitespaces
			while(isspace(*param) && *param != '\0') ++param;
			while(isspace(*value) && *value != '\0') ++value;
			while(isspace(*(param + strlen(param) - 1 )) && strlen(param) != 0)  *(param + strlen(param) - 1) = '\0';
			while(isspace(*(value + strlen(value) - 1 )) && strlen(value) != 0)  *(value + strlen(value) - 1) = '\0';
			if(strlen(param) != 0 && strlen(value) != 0)
			{
				//attempt to parse JT parameters
				if(strcmp(param, "jtName") == 0) set_jtName(value);
				if(strcmp(param, "jtMail") == 0) set_jtMail(value);
				if(strcmp(param, "jtComp") == 0) set_jtComp(value);
				if(strcmp(param, "jtDest") == 0) set_jtDest(atoi(value));
				if(strcmp(param, "wsTmp") == 0) set_wsTempDir(value);
				if(strcmp(param, "wsSpl") == 0) set_wsSplitSize(atol(value));
				//attempt to parse destination parameters
				if(strcmp(param, "Host") == 0) strcpy(tmpDestHost,value);
				if(strcmp(param, "PASV") == 0)
					if(strcmp(value, "no") == 0)
						tmpDestPASV = FALSE;
					else
						tmpDestPASV = TRUE;
				if(strcmp(param, "User") == 0) strcpy(tmpDestUser,value);
				if(strcmp(param, "Pass") == 0) strcpy(tmpDestPass,value);
				if(strcmp(param, "Upload") == 0) strcpy(tmpDestUpld,value);
				if(strcmp(param, "Notify") == 0) strcpy(tmpDestNotf,value);
			}
		}
		if(*currentLine == '[')  //assume it's a section delimiter
		{
			if( strcmp(currentLine,"[Global]") == 0 ) //assume it's the global section begining
				inGlobal = TRUE; //set inGlobal flag
			else if(inGlobal) //assume it's global section end
				inGlobal = FALSE; // so end it
			if(!inGlobal) //assume it's a destination section beginning
			{
				//attempt to store the previus destination data
				if(
					strlen(tmpDestID)   != 0 ||
					strlen(tmpDestHost) != 0 ||
					strlen(tmpDestUser) != 0 ||
					strlen(tmpDestPass) != 0   ) //data is valid
						destList->add( new dest(tmpDestID, tmpDestHost, tmpDestPASV, tmpDestUser, tmpDestPass, tmpDestUpld, tmpDestNotf) );
				else report("data not valid");
				//reset the tmpDest data
				strcpy(tmpDestID,  "");
				tmpDestPASV = TRUE;
				strcpy(tmpDestHost,"");
				strcpy(tmpDestUser,"");
				strcpy(tmpDestPass,"");
				strcpy(tmpDestUpld,"");
				strcpy(tmpDestNotf,"");
				//proceed to parse the destination header
				++currentLine; //strip the leading "["
				if( *(currentLine + strlen(currentLine) - 1) == ']')	//if the line ends on a "]"
					*(currentLine + strlen(currentLine) - 1) = '\0';	//strip it,
				else continue;											//it's a dirty line, next loop
				strcpy(value, currentLine); //store the new ID found for processing
				while(isspace(*value) && *value != '\0') ++value; //strip whitespaces from the beginnig
				while(isspace(*(value + strlen(value) - 1 )) && strlen(value) != 0)  *(value + strlen(value) - 1) = '\0'; //strip whitespaces from the end
				strcpy(tmpDestID, value);
			}
		}
	}
	//attempt to store the last destination data
	if(
		strlen(tmpDestID)   != 0 ||
		strlen(tmpDestHost) != 0 ||
		strlen(tmpDestUser) != 0 ||
		strlen(tmpDestPass) != 0   ) //data is valid
			destList->add( new dest(tmpDestID, tmpDestHost, tmpDestPASV, tmpDestUser, tmpDestPass, tmpDestUpld, tmpDestNotf) );
	else report("data not valid");
	fclose(iniFile);
}

Reply to: