add_sound_mapping cleanup
- avoid several buffer overflows - move use of access() to files.c in new can_read_file() function - remove extra newlines in raw_print() calls - get ready for lint, eg sprintf -> Sprintf - generally make the code look like core code, not Qt code
This commit is contained in:
@@ -630,6 +630,9 @@ E void FDECL(compress, (const char *));
|
||||
E void FDECL(uncompress, (const char *));
|
||||
E boolean FDECL(lock_file, (const char *,int,int));
|
||||
E void FDECL(unlock_file, (const char *));
|
||||
#ifdef USER_SOUNDS
|
||||
E boolean FDECL(can_read_file, (const char *));
|
||||
#endif
|
||||
E void FDECL(read_config_file, (const char *));
|
||||
E void FDECL(check_recordfile, (const char *));
|
||||
#if defined(WIZARD)
|
||||
@@ -1793,7 +1796,9 @@ E void FDECL(yelp, (struct monst *));
|
||||
E void FDECL(whimper, (struct monst *));
|
||||
E void FDECL(beg, (struct monst *));
|
||||
E int NDECL(dotalk);
|
||||
|
||||
#ifdef USER_SOUNDS
|
||||
E int FDECL(add_sound_mapping, (const char *));
|
||||
#endif
|
||||
|
||||
/* ### sys/msdos/sound.c ### */
|
||||
|
||||
|
||||
10
src/files.c
10
src/files.c
@@ -103,7 +103,6 @@ static int lockptr;
|
||||
#endif
|
||||
|
||||
#ifdef USER_SOUNDS
|
||||
extern int FDECL(add_sound_mapping, (const char* mapping));
|
||||
extern char *sounddir;
|
||||
#endif
|
||||
|
||||
@@ -1523,6 +1522,15 @@ char *tmp_levels;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef USER_SOUNDS
|
||||
boolean
|
||||
can_read_file(filename)
|
||||
const char *filename;
|
||||
{
|
||||
return (access(filename, 4) == 0);
|
||||
}
|
||||
#endif /* USER_SOUNDS */
|
||||
|
||||
void
|
||||
read_config_file(filename)
|
||||
const char *filename;
|
||||
|
||||
84
src/sounds.c
84
src/sounds.c
@@ -918,63 +918,65 @@ extern void FDECL(play_usersound, (const char*, int));
|
||||
|
||||
typedef struct audio_mapping_rec {
|
||||
struct re_pattern_buffer regex;
|
||||
char* filename;
|
||||
char *filename;
|
||||
int volume;
|
||||
struct audio_mapping_rec* next;
|
||||
struct audio_mapping_rec *next;
|
||||
} audio_mapping;
|
||||
|
||||
static audio_mapping* soundmap=0;
|
||||
static audio_mapping *soundmap = 0;
|
||||
|
||||
char* sounddir=".";
|
||||
char* sounddir = ".";
|
||||
|
||||
/* adds a sound file mapping, returns 0 on failure, 1 on success */
|
||||
int
|
||||
add_sound_mapping(mapping)
|
||||
const char* mapping;
|
||||
const char *mapping;
|
||||
{
|
||||
char text[256];
|
||||
char filename[256];
|
||||
char filespec[256];
|
||||
int volume;
|
||||
|
||||
if (sscanf(mapping, "MESG \"%[^\"]\"%*[\t ]\"%[^\"]\" %d",
|
||||
text, filename, &volume)==3)
|
||||
{
|
||||
const char* err;
|
||||
audio_mapping* new_map;
|
||||
if (sscanf(mapping, "MESG \"%255[^\"]\"%*[\t ]\"%255[^\"]\" %d",
|
||||
text, filename, &volume) == 3) {
|
||||
const char *err;
|
||||
audio_mapping *new_map;
|
||||
|
||||
sprintf(filespec,"%s/%s",sounddir,filename);
|
||||
if (strlen(sounddir) + strlen(filename) > 254) {
|
||||
raw_print("sound file name too long");
|
||||
return 0;
|
||||
}
|
||||
Sprintf(filespec, "%s/%s", sounddir, filename);
|
||||
|
||||
if (access(filespec, R_OK)==0) {
|
||||
new_map=(audio_mapping*)alloc(sizeof(audio_mapping));
|
||||
new_map->regex.translate=0;
|
||||
new_map->regex.fastmap=0;
|
||||
new_map->regex.buffer=0;
|
||||
new_map->regex.allocated=0;
|
||||
new_map->regex.regs_allocated=REGS_FIXED;
|
||||
new_map->filename=strdup(filespec);
|
||||
new_map->volume=volume;
|
||||
new_map->next=soundmap;
|
||||
if (can_read_file(filespec)) {
|
||||
new_map = (audio_mapping *)alloc(sizeof(audio_mapping));
|
||||
new_map->regex.translate = 0;
|
||||
new_map->regex.fastmap = 0;
|
||||
new_map->regex.buffer = 0;
|
||||
new_map->regex.allocated = 0;
|
||||
new_map->regex.regs_allocated = REGS_FIXED;
|
||||
new_map->filename = strdup(filespec);
|
||||
new_map->volume = volume;
|
||||
new_map->next = soundmap;
|
||||
|
||||
err=re_compile_pattern(text, strlen(text), &new_map->regex);
|
||||
err = re_compile_pattern(text, strlen(text), &new_map->regex);
|
||||
|
||||
if (err) {
|
||||
sprintf(text, "%s\n", err);
|
||||
raw_print(text);
|
||||
free(new_map->filename);
|
||||
free(new_map);
|
||||
return 0;
|
||||
} else {
|
||||
soundmap=new_map;
|
||||
}
|
||||
if (err) {
|
||||
raw_print(err);
|
||||
free(new_map->filename);
|
||||
free(new_map);
|
||||
return 0;
|
||||
} else {
|
||||
sprintf(text, "%s not readable.\n", filespec);
|
||||
raw_print(text);
|
||||
return 0;
|
||||
soundmap = new_map;
|
||||
}
|
||||
} else {
|
||||
sprintf(text, "syntax error in SOUND\n");
|
||||
} else {
|
||||
Sprintf(text, "cannot read %.243s", filespec);
|
||||
raw_print(text);
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
raw_print("syntax error in SOUND");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -984,13 +986,13 @@ void
|
||||
play_sound_for_message(msg)
|
||||
const char* msg;
|
||||
{
|
||||
audio_mapping* cursor=soundmap;
|
||||
audio_mapping* cursor = soundmap;
|
||||
|
||||
while (cursor) {
|
||||
if (re_search(&cursor->regex, msg, strlen(msg), 0, 9999, 0)>=0) {
|
||||
play_usersound(cursor->filename, cursor->volume);
|
||||
}
|
||||
cursor=cursor->next;
|
||||
if (re_search(&cursor->regex, msg, strlen(msg), 0, 9999, 0) >= 0) {
|
||||
play_usersound(cursor->filename, cursor->volume);
|
||||
}
|
||||
cursor = cursor->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user