X-Git-Url: https://git.draconx.ca/gitweb/upkg.git/blobdiff_plain/37a77c2825545435cfb3093eae1995efd35c20ba..HEAD:/src/engine/music-dummymod.c diff --git a/src/engine/music-dummymod.c b/src/engine/music-dummymod.c index a57c013..ef1cff1 100644 --- a/src/engine/music-dummymod.c +++ b/src/engine/music-dummymod.c @@ -1,30 +1,34 @@ /* - * upkg: tool for manipulating Unreal Tournament packages. - * Copyright (C) 2009 Nick Bowler + * upkg: tool for manipulating Unreal Tournament packages. + * Copyright © 2009-2011, 2022 Nick Bowler * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ +#include #include #include +#include #include "music-module.h" #include "upkg.h" struct music_mod { struct upkg_file *f; + + unsigned char header[64]; + unsigned long hdrlen; }; int music_mod_init(void) @@ -38,12 +42,15 @@ void music_mod_exit(void) struct music_mod *music_mod_open(struct upkg_file *f) { - struct music_mod *m = malloc(sizeof *m); + struct music_mod *m; - if (m) { - m->f = f; + m = malloc(sizeof *m); + if (!m) { + return NULL; } + m->f = f; + m->hdrlen = upkg_export_read(f, m->header, sizeof m->header); return m; } @@ -86,7 +93,49 @@ int music_mod_dump(struct music_mod *m, FILE *of) } } +int is_xm(unsigned char *buf, unsigned long len) +{ + static const char head[15] = + /* ASCII encoding of "Extended Module" */ + "\x45\x78\x74\x65\x6e\x64\x65\x64\x20\x4d\x6f\x64\x75\x6c\x65"; + + if (len >= sizeof head && memcmp(head, buf, sizeof head) == 0) + return 1; + return 0; +} + +int is_it(unsigned char *buf, unsigned long len) +{ + static const char head[4] = + /* ASCII encoding of "IMPM" */ + "\x49\x4d\x50\x4d"; + + if (len >= sizeof head && memcmp(head, buf, sizeof head) == 0) + return 1; + return 0; +} + +int is_s3m(unsigned char *buf, unsigned long len) +{ + static const char head[4] = + /* ASCII encoding of "SCRM" */ + "\x53\x43\x52\x4d"; + + if (len < 0x2c + sizeof head) + return 0; + if (memcmp(head, buf+0x2c, sizeof head) == 0) + return 1; + return 0; +} + const char *music_mod_type(struct music_mod *mod) { + if (is_xm(mod->header, mod->hdrlen)) + return "xm"; + if (is_it(mod->header, mod->hdrlen)) + return "it"; + if (is_s3m(mod->header, mod->hdrlen)) + return "s3m"; + return "unknown"; }