Ejemplo n.º 1
0
bool TCOD_lex_set_data_file(TCOD_lex_t *lex, const char *_filename)
{
	struct stat _st;
    FILE *f;
    char *ptr;
    if ( ! _filename ) {
    	TCOD_last_error = (char *)"Lex.setDatafile(NULL) called";
    	return false;
    }
    f = fopen( _filename, "r" );
    if ( f == NULL )
    {
		static char msg[255];
		sprintf(msg, "Cannot open '%s'", _filename);
		TCOD_last_error=strdup(msg);
		return false;
    }
    if ( stat( _filename, &_st ) == -1 )
    {
		static char msg[255];
		fclose(f);
		sprintf(msg,"Cannot stat '%s'", _filename );
		TCOD_last_error=strdup(msg);
		return false;
    }

    lex->buf = (char*)calloc(sizeof(char),(_st.st_size + 1));
    lex->filename = strdup( _filename );
    if ( lex->buf == NULL || lex->filename == NULL )
    {
		fclose(f);
		if ( lex->buf ) free(lex->buf);
		if ( lex->filename ) {
			free( lex->filename );
		}
		TCOD_last_error=(char *)"Out of memory";
		return false;
    }
	ptr=lex->buf;
	// can't rely on size to read because of MS/DOS dumb CR/LF handling
	while ( fgets(ptr, _st.st_size,f ) )
	{
		ptr += strlen(ptr);
	}
    fclose(f);
	TCOD_lex_set_data_buffer_internal(lex);
	lex->allocBuf=true;
	return true;
}
Ejemplo n.º 2
0
bool TCOD_lex_set_data_file(TCOD_lex_t *lex, const char *_filename)
{
    FILE *f;
    char *ptr;
    long size;
    if ( ! _filename ) {
    	TCOD_last_error = (char *)"Lex.setDatafile(NULL) called";
    	return false;
    }
    f = fopen( _filename, "rb" );
    if ( f == NULL )
    {
		static char msg[255];
		sprintf(msg, "Cannot open '%s'", _filename);
		TCOD_last_error=TCOD_strdup(msg);
		return false;
    }
	fseek(f, 0, SEEK_END);
   	size = ftell(f);
   	fclose(f);
    f = fopen( _filename, "r" );
    
    lex->buf = (char*)calloc(sizeof(char),(size + 1));
    lex->filename = TCOD_strdup( _filename );
    if ( lex->buf == NULL || lex->filename == NULL )
    {
		fclose(f);
		if ( lex->buf ) free(lex->buf);
		if ( lex->filename ) {
			free( lex->filename );
		}
		TCOD_last_error=(char *)"Out of memory";
		return false;
    }
	ptr=lex->buf;
	/* can't rely on size to read because of MS/DOS dumb CR/LF handling */
	while ( fgets(ptr, size,f ) )
	{
		ptr += strlen(ptr);
	}
    fclose(f);
	TCOD_lex_set_data_buffer_internal(lex);
	lex->allocBuf=true;
	return true;
}
Ejemplo n.º 3
0
void TCOD_lex_set_data_buffer(TCOD_lex_t *lex,char *dat)
{
	lex->buf = dat;
	lex->allocBuf = false;
	TCOD_lex_set_data_buffer_internal(lex);
}