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; }
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; }
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); }