Change maximum banner line length to 256.

Add color and attribute changing commands to banners: $ATTR()
Fix chroot creation script failing if no nethack binary exists.
This commit is contained in:
root 2012-06-03 09:45:58 +03:00
parent 820cecae54
commit f29618c783
3 changed files with 117 additions and 25 deletions

View File

@ -123,6 +123,25 @@ static struct dg_watchcols default_watchcols[] = {
#endif
};
int color_remap[16] = {
COLOR_PAIR(9) | A_NORMAL,
COLOR_PAIR(COLOR_BLUE) | A_NORMAL,
COLOR_PAIR(COLOR_GREEN) | A_NORMAL,
COLOR_PAIR(COLOR_CYAN) | A_NORMAL,
COLOR_PAIR(COLOR_RED) | A_NORMAL,
COLOR_PAIR(COLOR_MAGENTA) | A_NORMAL,
COLOR_PAIR(COLOR_YELLOW) | A_NORMAL,
COLOR_PAIR(COLOR_BLACK) | A_NORMAL,
COLOR_PAIR(10) | A_BOLD,
COLOR_PAIR(COLOR_BLUE) | A_BOLD,
COLOR_PAIR(COLOR_GREEN) | A_BOLD,
COLOR_PAIR(COLOR_CYAN) | A_BOLD,
COLOR_PAIR(COLOR_RED) | A_BOLD,
COLOR_PAIR(COLOR_MAGENTA) | A_BOLD,
COLOR_PAIR(COLOR_YELLOW) | A_BOLD,
COLOR_PAIR(COLOR_WHITE) | A_BOLD,
};
static struct dg_watchcols *default_watchcols_list[DGL_MAXWATCHCOLS + 1];
struct dg_user *
@ -434,14 +453,14 @@ banner_var_free()
char *
banner_var_resolve(struct dg_banner_var *bv)
{
static char tmpbuf[81];
static char tmpbuf[DGL_BANNER_LINELEN+1];
time_t tstamp;
struct tm *ptm;
if (!bv) return NULL;
if (!bv->special) return bv->value;
time(&tstamp);
ptm = gmtime(&tstamp);
strftime(tmpbuf, 80, bv->value, ptm);
strftime(tmpbuf, DGL_BANNER_LINELEN, bv->value, ptm);
return tmpbuf;
}
@ -479,8 +498,8 @@ banner_addline(struct dg_banner *ban, char *line)
if (!ban) return;
ban->len++;
ban->lines = realloc (ban->lines, sizeof (char *) * ban->len);
if (len >= 80) {
len = 80;
if (len >= DGL_BANNER_LINELEN) {
len = DGL_BANNER_LINELEN;
ban->lines[ban->len - 1] = malloc(len);
strncpy(ban->lines[ban->len - 1], line, len);
ban->lines[ban->len - 1][len-1] = '\0';
@ -492,10 +511,10 @@ void
loadbanner (char *fname, struct dg_banner *ban)
{
FILE *bannerfile;
char buf[80];
char buf[DGL_BANNER_LINELEN+1];
if (ban->len > 23) return;
memset (buf, 0, 80);
memset (buf, 0, DGL_BANNER_LINELEN);
bannerfile = fopen (fname, "r");
@ -503,22 +522,22 @@ loadbanner (char *fname, struct dg_banner *ban)
{
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);
snprintf(buf, DGL_BANNER_LINELEN, "### NOTE: administrator has not installed a %s file", fname);
banner_addline(ban, buf);
return;
}
while (fgets (buf, 80, bannerfile) != NULL)
while (fgets (buf, DGL_BANNER_LINELEN, bannerfile) != NULL)
{
char bufnew[80];
char bufnew[DGL_BANNER_LINELEN+1];
int slen;
memset (bufnew, 0, 80);
memset (bufnew, 0, DGL_BANNER_LINELEN);
slen = strlen(buf);
if ((slen > 0) && (buf[slen-1] == '\n')) buf[slen-1] = '\0';
strncpy(bufnew, buf, 80);
strncpy(bufnew, buf, DGL_BANNER_LINELEN);
if (strstr(bufnew, "$INCLUDE(")) {
char *fn = bufnew + 9;
char *fn_end = strchr(fn, ')');
@ -529,22 +548,22 @@ loadbanner (char *fname, struct dg_banner *ban)
}
}
} else {
char tmpbufnew[80];
char tmpbufnew[DGL_BANNER_LINELEN+1];
struct dg_banner_var *bv = globalconfig.banner_var_list;
while (bv) {
strncpy(bufnew, bannerstrmangle(bufnew, tmpbufnew, 80, bv->name, banner_var_resolve(bv)), 80);
strncpy(bufnew, bannerstrmangle(bufnew, tmpbufnew, DGL_BANNER_LINELEN, bv->name, banner_var_resolve(bv)), DGL_BANNER_LINELEN);
bv = bv->next;
}
strncpy(bufnew, bannerstrmangle(bufnew, tmpbufnew, 80, "$VERSION", PACKAGE_STRING), 80);
strncpy(bufnew, bannerstrmangle(bufnew, tmpbufnew, DGL_BANNER_LINELEN, "$VERSION", PACKAGE_STRING), DGL_BANNER_LINELEN);
if (me && loggedin) {
strncpy(bufnew, bannerstrmangle(bufnew, tmpbufnew, 80, "$USERNAME", me->username), 80);
strncpy(bufnew, bannerstrmangle(bufnew, tmpbufnew, DGL_BANNER_LINELEN, "$USERNAME", me->username), DGL_BANNER_LINELEN);
} else {
strncpy(bufnew, bannerstrmangle(bufnew, tmpbufnew, 80, "$USERNAME", "[Anonymous]"), 80);
strncpy(bufnew, bannerstrmangle(bufnew, tmpbufnew, DGL_BANNER_LINELEN, "$USERNAME", "[Anonymous]"), DGL_BANNER_LINELEN);
}
banner_addline(ban, bufnew);
}
memset (buf, 0, 80);
memset (buf, 0, DGL_BANNER_LINELEN);
if (ban->len >= 24)
break;
@ -557,11 +576,71 @@ void
drawbanner (struct dg_banner *ban)
{
unsigned int i;
char *tmpch, *tmpch2, *splch;
int attr = 0, oattr = 0;
if (!ban) return;
for (i = 0; i < ban->len; i++)
mvaddstr (1 + i, 1, ban->lines[i]);
for (i = 0; i < ban->len; i++) {
char *tmpbuf = strdup(ban->lines[i]);
char *tmpbuf2 = tmpbuf;
int ok = 0;
int x = 1;
do {
ok = 0;
if ((tmpch = strstr(tmpbuf2, "$ATTR("))) {
if ((tmpch2 = strstr(tmpch, ")"))) {
int spl = 0;
char *nxttmpch;
ok = 1;
oattr = attr;
attr = A_NORMAL;
*tmpch = *tmpch2 = '\0';
tmpch += 6;
nxttmpch = tmpch;
do {
spl = 0;
splch = strchr(tmpch, ';');
if (splch && *splch) {
spl = 1;
nxttmpch = splch;
*nxttmpch = '\0';
nxttmpch++;
}
if (tmpch && *tmpch) {
switch (*tmpch) {
default: break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
{
int num = atoi(tmpch);
if (num >= 0 && num <= 15)
attr |= color_remap[num];
}
break;
case 'b': attr |= A_BOLD; break;
case 's': attr |= A_STANDOUT; break;
case 'u': attr |= A_UNDERLINE; break;
case 'r': attr |= A_REVERSE; break;
case 'd': attr |= A_DIM; break;
}
} else attr = A_NORMAL;
tmpch = nxttmpch;
} while (spl);
mvaddstr(1 + i, x, tmpbuf2);
if (oattr) attroff(oattr);
if (attr) attron(attr);
x += strlen(tmpbuf2);
tmpch2++;
tmpbuf2 = tmpch2;
} else
mvaddstr (1 + i, x, tmpbuf2);
} else
mvaddstr (1 + i, x, tmpbuf2);
} while (ok);
free(tmpbuf);
}
}
void
@ -1678,8 +1757,19 @@ initcurses ()
#ifdef USE_NCURSES_COLOR
start_color();
use_default_colors();
init_pair(1, -1, -1);
init_pair(2, COLOR_RED, -1);
init_pair(COLOR_BLACK, COLOR_WHITE, COLOR_BLACK);
init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK);
init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK);
init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK);
init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK);
init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK);
init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK);
init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK);
init_pair(9, 0, COLOR_BLACK);
init_pair(10, COLOR_BLACK, COLOR_BLACK);
init_pair(11, -1, -1);
if (globalconfig.utf8esc) write(1, "\033%G", 3);
#endif
clear();

View File

@ -25,14 +25,16 @@
#define DGL_MAXWATCHCOLS 10
#define DGL_BANNER_LINELEN 256 /* max. length of banner lines*/
#ifdef USE_NCURSES_COLOR
# define CLR_NORMAL COLOR_PAIR(1) | A_NORMAL
# define CLR_RED COLOR_PAIR(2) | A_NORMAL
# define CLR_NORMAL COLOR_PAIR(11) | A_NORMAL
# define CLR_RED COLOR_PAIR(COLOR_RED) | A_NORMAL
#else
# define CLR_NORMAL 0
# define CLR_RED 0
#endif
extern int color_remap[];
typedef enum
{

View File

@ -15,7 +15,7 @@ CHROOT="/opt/nethack/nethack.alt.org/"
USRGRP="games:games"
# COMPRESS from include/config.h; the compression binary to copy. leave blank to skip.
COMPRESSBIN="/bin/gzip"
# nethack binary to copy into chroot
# nethack binary to copy into chroot (leave blank to skip)
NETHACKBIN="/home/paxed/hacking/coding/nethacksource/nethack-3.4.3-nao/nh343/nethack.343-nao"
# fixed data to copy (leave blank to skip)
NH_PLAYGROUND_FIXED="/home/paxed/hacking/coding/nethacksource/nethack-3.4.3-nao/nh343/"
@ -149,7 +149,7 @@ NHSUBDIR="`echo ${NHSUBDIR#/}`"
mkdir "$CHROOT/$NHSUBDIR"
if [ ! -e "$NETHACKBIN" ]; then
if [ -n "$NETHACKBIN" -a ! -e "$NETHACKBIN" ]; then
errorexit "Cannot find NetHack binary $NETHACKBIN"
fi