]> skyeroc.xyz Git - dgamelaunch/commitdiff
Change maximum banner line length to 256.
authorroot <root@floozy>
Sun, 3 Jun 2012 06:45:58 +0000 (09:45 +0300)
committerroot <root@floozy>
Sun, 3 Jun 2012 06:45:58 +0000 (09:45 +0300)
Add color and attribute changing commands to banners: $ATTR()
Fix chroot creation script failing if no nethack binary exists.

dgamelaunch.c
dgamelaunch.h
dgl-create-chroot

index 5a385f78397a344b926681e3035bfa477cb53f2a..ea141ba411afb58fff738483f0dba119de5dd652 100644 (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();
index 80e55170bc8339c8519586a2d2ae104ba10e72a5..b16f6092539ef66064e9a4ddda6f17e6acc42e3c 100644 (file)
 
 #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
 {
index 07cf0861c4d25ce1dc98a9285be87b723002cb2b..a6814bc31658c2f7082a6fbd30b4ab3c03ce802c 100755 (executable)
@@ -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