Browse Source

* libee/ee.c:

+ Error checking in ee_init().
    + Pre-generate the empty line for ee_clear().
  * libee/sprite.c:
    + Better error checking in ee_sprite_load().


git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/ttyvaders/trunk@168 92316355-f0b4-4df1-b90c-862c8a59935f
master
sam 21 years ago
parent
commit
3022049352
4 changed files with 58 additions and 29 deletions
  1. +9
    -2
      libee/ee.c
  2. +2
    -0
      libee/ee_internals.h
  3. +1
    -10
      libee/graphics.c
  4. +46
    -17
      libee/sprite.c

+ 9
- 2
libee/ee.c View File

@@ -67,6 +67,7 @@ char *ee_color_names[16] =
}; };


static int _ee_delay; static int _ee_delay;
char *_ee_empty_line;


#if defined(USE_NCURSES) #if defined(USE_NCURSES)
int _ee_attr[16]; int _ee_attr[16];
@@ -166,11 +167,13 @@ int ee_init(void)
} }


#elif defined(USE_CONIO) #elif defined(USE_CONIO)
gettextinfo(&ti);
_ee_screen = malloc(2 * ti.screenwidth * ti.screenheight);
if(_ee_screen == NULL)
return -1;
_wscroll = 0; _wscroll = 0;
_setcursortype(_NOCURSOR); _setcursortype(_NOCURSOR);
clrscr(); clrscr();
gettextinfo(&ti);
_ee_screen = malloc(2 * ti.screenwidth * ti.screenheight);
# if defined(SCREENUPDATE_IN_PC_H) # if defined(SCREENUPDATE_IN_PC_H)
ScreenRetrieve(_ee_screen); ScreenRetrieve(_ee_screen);
# else # else
@@ -178,6 +181,10 @@ int ee_init(void)
# endif # endif


#endif #endif
_ee_empty_line = malloc(ee_get_width() + 1);
memset(_ee_empty_line, ' ', ee_get_width());
_ee_empty_line[ee_get_width()] = '\0';

_ee_delay = 0; _ee_delay = 0;


return 0; return 0;


+ 2
- 0
libee/ee_internals.h View File

@@ -31,4 +31,6 @@ extern int _ee_attr[];
extern char *_ee_screen; extern char *_ee_screen;
#endif #endif


extern char *_ee_empty_line;

#endif /* __EE_INTERNALS_H__ */ #endif /* __EE_INTERNALS_H__ */

+ 1
- 10
libee/graphics.c View File

@@ -118,18 +118,9 @@ void ee_putstr(int x, int y, char *s)
void ee_clear(void) void ee_clear(void)
{ {
/* We could use SLsmg_cls() etc., but drawing empty lines is much faster */ /* We could use SLsmg_cls() etc., but drawing empty lines is much faster */
int x = ee_get_width();
int y = ee_get_height(); int y = ee_get_height();
char *empty_line = malloc((x + 1) * sizeof(char));

memset(empty_line, ' ', x);
empty_line[x] = '\0';


while(y--) while(y--)
{
ee_putstr(0, y, empty_line);
}

free(empty_line);
ee_putstr(0, y, _ee_empty_line);
} }



+ 46
- 17
libee/sprite.c View File

@@ -54,6 +54,9 @@ struct ee_sprite *ee_load_sprite(const char *file)
return NULL; return NULL;


sprite = malloc(sizeof(struct ee_sprite)); sprite = malloc(sizeof(struct ee_sprite));
if(sprite == NULL)
goto sprite_alloc_failed;

sprite->nf = 0; sprite->nf = 0;
sprite->frames = NULL; sprite->frames = NULL;


@@ -71,11 +74,23 @@ struct ee_sprite *ee_load_sprite(const char *file)
if(w <= 0 || h <= 0 || w > BUFSIZ / 2) if(w <= 0 || h <= 0 || w > BUFSIZ / 2)
break; break;


if(sprite->nf++)
sprite->frames = realloc(sprite->frames,
sprite->nf * sizeof(struct ee_frame));
if(sprite->nf)
{
void *tmp = realloc(sprite->frames,
(sprite->nf + 1) * sizeof(struct ee_frame));
if(tmp == NULL)
goto frame_failed;
sprite->frames = tmp;
sprite->nf++;
}
else else
sprite->frames = malloc(sprite->nf * sizeof(struct ee_frame));
{
sprite->frames = malloc((sprite->nf + 1) * sizeof(struct ee_frame));
if(sprite->frames == NULL)
goto sprite_failed;
sprite->nf++;
}

frame = &sprite->frames[sprite->nf - 1]; frame = &sprite->frames[sprite->nf - 1];


frame->w = w; frame->w = w;
@@ -83,12 +98,23 @@ struct ee_sprite *ee_load_sprite(const char *file)
frame->dx = dx; frame->dx = dx;
frame->dy = dy; frame->dy = dy;
frame->chars = malloc(w * h * sizeof(char)); frame->chars = malloc(w * h * sizeof(char));
if(frame->chars == NULL)
{
sprite->nf--;
goto frame_failed;
}
frame->color = malloc(w * h * sizeof(int)); frame->color = malloc(w * h * sizeof(int));
if(frame->color == NULL)
{
free(frame->chars);
sprite->nf--;
goto frame_failed;
}


for(y = 0; y < h; y++) for(y = 0; y < h; y++)
{ {
if(!fgets(buf, BUFSIZ, fd)) if(!fgets(buf, BUFSIZ, fd))
goto failed;
goto frame_failed;


for(x = 0; x < w && buf[x] && buf[x] != '\r' && buf[x] != '\n'; x++) for(x = 0; x < w && buf[x] && buf[x] != '\r' && buf[x] != '\n'; x++)
frame->chars[w * y + x] = buf[x]; frame->chars[w * y + x] = buf[x];
@@ -100,7 +126,7 @@ struct ee_sprite *ee_load_sprite(const char *file)
for(y = 0; y < h; y++) for(y = 0; y < h; y++)
{ {
if(!fgets(buf, BUFSIZ, fd)) if(!fgets(buf, BUFSIZ, fd))
goto failed;
goto frame_failed;


for(x = 0; x < w && buf[x] && buf[x] != '\r' && buf[x] != '\n'; x++) for(x = 0; x < w && buf[x] && buf[x] != '\r' && buf[x] != '\n'; x++)
frame->color[w * y + x] = buf[x] - 'a'; frame->color[w * y + x] = buf[x] - 'a';
@@ -110,23 +136,26 @@ struct ee_sprite *ee_load_sprite(const char *file)
} }


continue; continue;

failed:
free(sprite->frames[sprite->nf - 1].chars);
free(sprite->frames[sprite->nf - 1].color);
sprite->nf--;
break;
} }


if(sprite->nf == 0)
goto sprite_failed;

fclose(fd); fclose(fd);
return sprite;


if(sprite->nf == 0)
frame_failed:
while(sprite->nf)
{ {
free(sprite);
return NULL;
free(sprite->frames[sprite->nf - 1].color);
free(sprite->frames[sprite->nf - 1].chars);
sprite->nf--;
} }

return sprite;
sprite_failed:
free(sprite);
sprite_alloc_failed:
fclose(fd);
return NULL;
} }


int ee_get_sprite_frames(struct ee_sprite *sprite) int ee_get_sprite_frames(struct ee_sprite *sprite)


Loading…
Cancel
Save