im having a issue, i have a screen where users can input a name for there player and after 7 letters and some other combos and back slashs it will freeze the application and hang
this is the code from the control file which i think is where the error is
#include "controls.h"
SDL_Event control_event;
static void DeleteChar(char text[], unsigned int pos){
strcpy(text+pos, text+pos+1);
printf("Remove Char : %s \n", text);
}
static void InsertChar(char text[], unsigned int pos, char c) {
char *buf;
sprintf(buf, "%c%s", c, text+pos);
strcpy(text+pos, buf);
free(buf);
printf("Insert Char : %s \n", text);
}
static void keydown_event(SDL_keysym* key) {
switch(app_state) {
case 1:
switch(key->sym) {
case SDLK_ESCAPE:
app_exit = 0; // exits application
break;
case SDLK_UP:
if(menu_selections > 1) { menu_selections--; }
break;
case SDLK_DOWN:
if(menu_selections < 3) { menu_selections++; }
break;
case SDLK_RETURN:
// actions for menu selection
switch(menu_selections) {
case 1:
// setup new game variables
SDL_Delay(500);
SDL_EnableUNICODE(SDL_ENABLE); // enables Unicode for text input
app_state = 4;
break;
case 2:
SDL_Delay(500);
app_state = 2;
break;
case 3:
SDL_Delay(500);
app_state = 3;
break;
}
break;
default:
break;
}
break;
case 2:
switch(key->sym) {
case SDLK_ESCAPE:
app_exit = 0; // exits application
break;
default:
break;
}
break;
case 3:
switch(key->sym) {
case SDLK_ESCAPE:
app_exit = 0; // exits application
break;
default:
break;
}
break;
case 4:
if(strlen(name_input) <= 16) {
if((control_event.key.keysym.unicode >= (Uint16) 'A') && (control_event.key.keysym.unicode <= (Uint16) 'Z') ) {
InsertChar(name_input, strlen(name_input), (char)control_event.key.keysym.unicode);
name_display = TTF_RenderText_Solid(menu_font, name_input, blackColor);
printf("uppercase render\n");
}else if( (control_event.key.keysym.unicode >= (Uint16) 'a') && (control_event.key.keysym.unicode <= (Uint16) 'z') ) {
InsertChar(name_input, strlen(name_input), (char)control_event.key.keysym.unicode);
name_display = TTF_RenderText_Solid(menu_font, name_input, blackColor);
printf("lowercase render\n");
}
}
switch(key->sym) {
case SDLK_BACKSPACE:
if(ngs == 1) { if(strlen(name_input) != 0) {
DeleteChar(name_input, strlen((const char*)name_input)-1);
name_display = TTF_RenderText_Solid(menu_font, name_input, blackColor);
printf("Backspace render\n");
} }
break;
case SDLK_ESCAPE:
app_exit = 0; // exits application
break;
case SDLK_LEFT:
if(ngs_race > 1) { ngs_race--; }
break;
case SDLK_RIGHT:
if(ngs_race < 3) { ngs_race++; }
break;
case SDLK_RETURN:
switch(ngs) {
case 1:
// SDL_EnableUNICODE(SDL_DISABLE);
break;
case 2:
break;
case 3:
break;
}
break;
default:
break;
}
break;
}
}
void handle_controls(){
while(SDL_PollEvent(&control_event)) {
switch(control_event.type) {
case SDL_KEYDOWN:
keydown_event(&control_event.key.keysym);
break;
case SDL_QUIT:
app_exit = 0; // exits application
break;
}
}
}