readscreen.c

Read a file for a screen and place it into the ``map'' array. #include <stdio.h> #include "sokoban.h" extern char *malloc(); extern FILE *fopen(); extern short level, packets, savepack, rows, cols; extern char map[MAXROW+1][MAXCOL+1]; extern POS ppos; short readscreen() { FILE *screen; char *fnam; short j, c, ret = 0; fnam = malloc( strlen( SCREENPATH) + 11); sprintf( fnam, "%s/screen.%d", SCREENPATH, level); Create the filename. Could have used MAXPATHLEN for the array if( (screen = fopen( fnam, "r")) == NULL) ret = E_FOPENSCREEN; else { packets = savepack = rows = j = cols = 0; ppos.x = -1; ppos.y = -1; while( (ret == 0) && ((c = getc( screen)) != EOF)) { if( c == '\n') { map[rows++][j] = '\0'; if( rows > MAXROW) ret = E_TOMUCHROWS; else { if( j > cols) cols = j; j = 0; } } else if( (c == player.obj_intern) || (c == playerstore.obj_intern)) { if( ppos.x != -1) ret = E_PLAYPOS1; else { ppos.x = rows; ppos.y = j; map[rows][j++] = c; if( j > MAXCOL) ret = E_TOMUCHCOLS; } } else if( (c == save.obj_intern) || (c == packet.obj_intern) || (c == wall.obj_intern) || (c == store.obj_intern) || (c == ground.obj_intern)) { if( c == save.obj_intern) { savepack++; packets++; } if( c == packet.obj_intern) packets++; map[rows][j++] = c; if( j > MAXCOL) ret = E_TOMUCHCOLS; } else ret = E_ILLCHAR; } fclose( screen); if( (ret == 0) && (ppos.x == -1)) ret = E_PLAYPOS2; } return( ret); }