Example #1
0
/*Decide si el siguiente caracter leido pertenece a 'Ch'.
 * consume el caracter leido
 *Deja el resultado accesible en 'result'*/
static bool is_the_next_char (Lexer *input, const char *ch){

	bool result = false;
	bstring taken = NULL;

	/*Pre:*/
	assert (input != NULL);

	/*Leo el siguiente caracter para ver si pertenece a 'ch'*/
	if (!lexer_is_off (input)){
		lexer_next_char (input, ch);
		/*si (leyo algo) ´o´ (no EOF y no leyo nada)*/
		if (!lexer_is_off (input)){
			taken = lexer_item (input);
			/*Decide si leyo el caracter perteneciente a 'ch'*/
			if ((blength (taken) > 0)){
				result = true;
			}
			/*libero el puntero despues de usarlo*/
			bdestroy (taken);
		}
	}

	return result;
}
Example #2
0
/*lee el siguiente item.
 * Consume todo caracter hasta encontrar alguno perteneciente a 'str'.
 *Deja el resultado accesible en 'result'. El llamador se encarga de liberarlo*/
static bstring next_bstring (Lexer *input, const char *str){

	bstring result=NULL;
	/*Pre:*/
	assert (input != NULL);
	/*Leo todos los caracteres anteriores y no pertenecientes a 'str'*/
	if (!lexer_is_off (input)){
		lexer_next_to (input, str);
		/*si (leyo algo) ´o´ (no EOF y no leyo nada)*/
		if (!lexer_is_off (input)){
			result = lexer_item(input);
			/*Si no leyo ningun caracter, destruyo el puntero.
			 * Esto pasa cuando el caracter inmediato a leer pertenece a str
			 * y el item es vacio*/
			if (blength (result) == 0){
				bdestroy (result);
				result=NULL;
			}
		}
	}

	return result;
}
Example #3
0
int parse_string (const string_t client_string, list_s lista) {
	string_t almost_done = NULL;
	string_t done = NULL;
	FILE * strf = NULL;

	int result = CODE_OK;

	assert (client_string != NULL && lista != NULL);
	strf = fmemopen (client_string, strlen(client_string) + 1, "r");
	if (strf != NULL) {
		Lexer * l = lexer_new (strf);

		lexer_next_to (l, "\n");
		almost_done = lexer_item (l);
		if (strncmp (client_string, almost_done, strlen (client_string) - 2) != 0)
			return BAD_EOL;
		lexer_destroy (l);
		fclose (strf);
		
		if (strlen (almost_done) > 1 && almost_done != NULL) {
			strf = fmemopen (almost_done, strlen(almost_done), "r");
			if (strf != NULL) {
				Lexer * j = lexer_new (strf);
				lexer_next_to (j, "\r");
				done = lexer_item (j);
				lexer_destroy (j);
				fclose (strf);

				if (strlen (done) > 1 && done != NULL) {
					strf = fmemopen (done, strlen(done), "r");
					if (strf){
						string_t valid_elem = NULL;
						Lexer * p = lexer_new (strf);
	
						while (!lexer_is_off (p)) {
							lexer_next (p, SUPERALPHANUMERIC);
							valid_elem = lexer_item (p);
							list_adjoin_back (lista, valid_elem);
							lexer_skip (p, BLANK);
						}
						lexer_destroy (p); p = NULL;
						fclose (strf);
					}
					else {
						fprintf (stderr, "fmemopen");
						result = INTERNAL_ERROR;
					}
				}
				else {
					if (done != NULL)
						result = STRING_VOID;
					else
						result = INTERNAL_ERROR;
				}
			}
			else {
				fprintf (stderr, "fmemopen");
				result = INTERNAL_ERROR;
			}
		}
		else {
			if (almost_done != NULL)
				result = STRING_VOID;
			else
				result = INTERNAL_ERROR;
		}
		if(almost_done != NULL) {
			free (almost_done); almost_done = NULL;
		}
		if(done != NULL) {
			free (done); done = NULL;
		}
	}
	else {
		fprintf (stderr, "fmemopen");
		result = INTERNAL_ERROR;
	}

	return result;
}