Add $INCLUDE(filename) menu banner command.

That text in any line of a menu banner file will cause
the file 'filename' to be included in that place.


git-svn-id: svn://katsu.triplehelix.org/dgamelaunch/trunk@548 db0b04b0-f4d1-0310-9a6d-de3e77497b0e
This commit is contained in:
Pasi Kallinen 2010-05-03 17:54:13 +00:00
parent 431ef1e791
commit 082c777fe8
1 changed files with 67 additions and 28 deletions

View File

@ -338,36 +338,58 @@ bannerstrmangle(char *buf, char *fromstr, char *tostr)
return bufnew;
}
void
freebanner(struct dg_banner *ban)
{
unsigned int l;
if (!ban) return;
l = ban->len;
while (l > 0) {
l--;
free(ban->lines[l]);
}
free(ban->lines);
ban->len = 0;
ban->lines = NULL;
}
void
banner_addline(struct dg_banner *ban, char *line)
{
size_t len = strlen(line);
if (!ban) return;
ban->len++;
ban->lines = realloc (ban->lines, sizeof (char *) * ban->len);
if (len >= 80) {
len = 80;
ban->lines[ban->len - 1] = malloc(len);
strncpy(ban->lines[ban->len - 1], line, len);
ban->lines[ban->len - 1][len-1] = '\0';
} else
ban->lines[ban->len - 1] = strdup(line);
}
void
loadbanner (char *fname, struct dg_banner *ban)
{
FILE *bannerfile;
char buf[80];
if (ban->len > 23) return;
memset (buf, 0, 80);
if (ban->lines) return;
bannerfile = fopen (fname, "r");
if (!bannerfile)
{
#define NOTE_NO_DGL_BANNER "### NOTE: administrator has not installed a %s file"
size_t len;
ban->len = 2;
ban->lines = malloc (sizeof (char *));
ban->lines[0] =
strdup ("### dgamelaunch " PACKAGE_VERSION
" - network console game launcher");
len = strlen(fname) + ARRAY_SIZE(NOTE_NO_DGL_BANNER);
ban->lines[1] = malloc(len);
snprintf(ban->lines[1], len, NOTE_NO_DGL_BANNER, fname);
#undef NOTE_NO_DGL_BANNER
return;
if (ban->len == 0)
banner_addline(ban, "### dgamelaunch " PACKAGE_VERSION " - network console game launcher");
snprintf(buf, 80, "### NOTE: administrator has not installed a %s file", fname);
banner_addline(ban, buf);
return;
}
ban->len = 0;
while (fgets (buf, 80, bannerfile) != NULL)
{
char bufnew[80];
@ -378,22 +400,31 @@ loadbanner (char *fname, struct dg_banner *ban)
slen = strlen(buf);
if ((slen > 0) && (buf[slen-1] == '\n')) buf[slen-1] = '\0';
ban->len++;
ban->lines = realloc (ban->lines, sizeof (char *) * ban->len);
strncpy(bufnew, buf, 80);
strncpy(bufnew, bannerstrmangle(bufnew, "$VERSION", PACKAGE_STRING), 80);
strncpy(bufnew, bannerstrmangle(bufnew, "$SERVERID", globalconfig.server_id ? globalconfig.server_id : ""), 80);
if (me && loggedin) {
strncpy(bufnew, bannerstrmangle(bufnew, "$USERNAME", me->username), 80);
if (strstr(bufnew, "$INCLUDE(")) {
char *fn = bufnew + 9;
char *fn_end = strchr(fn, ')');
if (fn_end) {
*fn_end = '\0';
if (strcmp(fname, fn)) {
banner_addline(ban, fn);
loadbanner(fn, ban);
}
}
} else {
strncpy(bufnew, bannerstrmangle(bufnew, "$USERNAME", "[Anonymous]"), 80);
strncpy(bufnew, bannerstrmangle(bufnew, "$VERSION", PACKAGE_STRING), 80);
strncpy(bufnew, bannerstrmangle(bufnew, "$SERVERID", globalconfig.server_id ? globalconfig.server_id : ""), 80);
if (me && loggedin) {
strncpy(bufnew, bannerstrmangle(bufnew, "$USERNAME", me->username), 80);
} else {
strncpy(bufnew, bannerstrmangle(bufnew, "$USERNAME", "[Anonymous]"), 80);
}
banner_addline(ban, bufnew);
}
ban->lines[ban->len - 1] = strdup(bufnew);
memset (buf, 0, 80);
if (ban->len == 24)
if (ban->len >= 24)
break;
}
@ -2135,7 +2166,10 @@ runmenuloop(struct dg_menu *menu)
mvprintw(menu->cursor_y, menu->cursor_x, "");
refresh();
userchoice = dgl_getch();
if (userchoice == ERR) return 1;
if (userchoice == ERR) {
freebanner(&ban);
return 1;
}
tmpopt = menu->options;
while (tmpopt) {
if (strchr(tmpopt->keys, userchoice)) {
@ -2148,11 +2182,13 @@ runmenuloop(struct dg_menu *menu)
}
if (return_from_submenu) {
freebanner(&ban);
return_from_submenu = 0;
return 0;
}
if (check_retard(0)) {
freebanner(&ban);
debug_write("retard");
graceful_exit(119);
}
@ -2414,7 +2450,8 @@ main (int argc, char** argv)
graceful_exit(0);
}
banner.len = 0;
banner.lines = NULL;
loadbanner(globalconfig.banner, &banner);
dgl_exec_cmdqueue(globalconfig.cmdqueue[DGLTIME_DGLSTART], 0, NULL);
@ -2476,6 +2513,8 @@ main (int argc, char** argv)
if (me)
free (me);
freebanner(&banner);
graceful_exit (1);
return 1;