From c13180cb2bead49addb00f33f4999200cbbd801f Mon Sep 17 00:00:00 2001
From: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Date: Wed, 26 Feb 2020 10:16:14 +0100
Subject: [PATCH] fix static linking with ncurses

Prefix LINES and COLS with MINICOM_ to avoid the following build failure
when building statically with ncurses:

/home/giuliobenetti/autobuild/run/instance-1/output-1/per-package/minicom/host/bin/arm-linux-gcc  -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64  -Os   -static -W -Wall -Wextra -std=gnu99 -fno-common -Wno-format-truncation  -static -o minicom minicom.o vt100.o config.o help.o updown.o util.o dial.o window.o wkeys.o ipc.o windiv.o sysdep1.o sysdep1_s.o sysdep2.o rwconf.o main.o file.o getsdir.o wildmat.o common.o  ../lib/libport.a  -lncurses
/home/giuliobenetti/autobuild/run/instance-1/output-1/per-package/minicom/host/opt/ext-toolchain/bin/../lib/gcc/arm-buildroot-linux-uclibcgnueabi/8.3.0/../../../../arm-buildroot-linux-uclibcgnueabi/bin/ld: /home/giuliobenetti/autobuild/run/instance-1/output-1/per-package/minicom/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/lib/libncurses.a(lib_setup.o):(.bss+0x100): multiple definition of `COLS'; window.o:(.bss+0x38): first defined here
/home/giuliobenetti/autobuild/run/instance-1/output-1/per-package/minicom/host/opt/ext-toolchain/bin/../lib/gcc/arm-buildroot-linux-uclibcgnueabi/8.3.0/../../../../arm-buildroot-linux-uclibcgnueabi/bin/ld: /home/giuliobenetti/autobuild/run/instance-1/output-1/per-package/minicom/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/lib/libncurses.a(lib_setup.o):(.bss+0x104): multiple definition of `LINES'; window.o:(.bss+0x3c): first defined here
collect2: error: ld returned 1 exit status
Makefile:448: recipe for target 'minicom' failed

Fixes:
 - http://autobuild.buildroot.org/results/d3edbab1f2cd0f7b790e2559dc8d489497ae02f3

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
[Upstream status: sent to minicom-devel@lists.alioth.debian.org]
---
 src/config.c  |   8 ++--
 src/dial.c    |  10 ++---
 src/file.c    |   8 ++--
 src/help.c    |   4 +-
 src/main.c    |  68 ++++++++++++++++-----------------
 src/minicom.c |   2 +-
 src/vt100.c   |   2 +-
 src/windiv.c  |   8 ++--
 src/window.c  | 102 +++++++++++++++++++++++++-------------------------
 src/window.h  |   2 +-
 10 files changed, 107 insertions(+), 107 deletions(-)

diff --git a/src/config.c b/src/config.c
index 87901f0..3c26f9f 100644
--- a/src/config.c
+++ b/src/config.c
@@ -1078,7 +1078,7 @@ static void doscrkeyb(void)
         } else {
           psets(P_STATLINE, N_("enabled"));
           /* See if it fits on screen */
-          if (LINES > 24)
+          if (MINICOM_LINES > 24)
             tempst = 0;
         }
         mc_wlocate(w, mbswidth(status_line) + 1, 2);
@@ -1140,7 +1140,7 @@ static void doscrkeyb(void)
 
         if (st) {
           mc_wclose(st,0);
-          st = mc_wopen(0, LINES - 1, COLS - 1, LINES - 1, BNONE,
+          st = mc_wopen(0, MINICOM_LINES - 1, MINICOM_COLS - 1, MINICOM_LINES - 1, BNONE,
                      XA_NORMAL, sfcolor, sbcolor, 1, 0, 1);
           show_status();
         }
@@ -1159,7 +1159,7 @@ static void doscrkeyb(void)
 
         if (st) {
           mc_wclose(st,0);
-          st = mc_wopen(0, LINES - 1, COLS - 1, LINES - 1, BNONE,
+          st = mc_wopen(0, MINICOM_LINES - 1, MINICOM_COLS - 1, MINICOM_LINES - 1, BNONE,
                      XA_NORMAL, sfcolor, sbcolor, 1, 0, 0);
           show_status();
         }
@@ -1326,7 +1326,7 @@ int dotermmenu(void)
         } else {
           psets(P_STATLINE, N_("enabled"));
           /* See if it fits on screen */
-          if (LINES > 24 || use_status)
+          if (MINICOM_LINES > 24 || use_status)
             tempst = 0;
         }
         mc_wlocate(w, mbswidth(status_line) + 1, 3);
diff --git a/src/dial.c b/src/dial.c
index 5076b32..5ef7ac3 100644
--- a/src/dial.c
+++ b/src/dial.c
@@ -1575,7 +1575,7 @@ void dialdir(void)
                     *move_exit = N_(" Move entry up/down, Escape to exit");
   unsigned int tagmvlen = 0;
   size_t i;
-  int position_dialing_directory = ((COLS / 2) + 32 - DIALOPTS * DIAL_WIDTH) / 2;
+  int position_dialing_directory = ((MINICOM_COLS / 2) + 32 - DIALOPTS * DIAL_WIDTH) / 2;
 
   dprev = -1;
   dname[0] = 0;
@@ -1586,11 +1586,11 @@ void dialdir(void)
   /* Alright, draw the dialing directory! */
 
   dirflush = 0;
-  x1 = (COLS / 2) - 37;
-  x2 = (COLS / 2) + 37;
-  dsub = mc_wopen(x1 - 1, LINES - 3, x2 + 1, LINES - 3, BNONE,
+  x1 = (MINICOM_COLS / 2) - 37;
+  x2 = (MINICOM_COLS / 2) + 37;
+  dsub = mc_wopen(x1 - 1, MINICOM_LINES - 3, x2 + 1, MINICOM_LINES - 3, BNONE,
                XA_REVERSE | stdattr, mfcolor, mbcolor, 0, 0, 1);
-  w = mc_wopen(x1, 2, x2, LINES - 6, BSINGLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
+  w = mc_wopen(x1, 2, x2, MINICOM_LINES - 6, BSINGLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
   mc_wcursor(w, CNONE);
   mc_wtitle(w, TMID, _("Dialing Directory"));
   mc_wputs(w,
diff --git a/src/file.c b/src/file.c
index be26afd..7c208a7 100644
--- a/src/file.c
+++ b/src/file.c
@@ -491,11 +491,11 @@ static void init_filedir(void)
   int x1, x2;
 
   dirflush = 0;
-  x1 = (COLS / 2) - 37;
-  x2 = (COLS / 2) + 37;
-  dsub = mc_wopen(x1 - 1, LINES - 3, x2 + 1, LINES - 3, BNONE, 
+  x1 = (MINICOM_COLS / 2) - 37;
+  x2 = (MINICOM_COLS / 2) + 37;
+  dsub = mc_wopen(x1 - 1, MINICOM_LINES - 3, x2 + 1, MINICOM_LINES - 3, BNONE, 
                stdattr, mfcolor, mbcolor, 0, 0, 1);
-  main_w = mc_wopen(x1, 2, x2, LINES - 6, BSINGLE, stdattr, mfcolor,
+  main_w = mc_wopen(x1, 2, x2, MINICOM_LINES - 6, BSINGLE, stdattr, mfcolor,
                  mbcolor, 0, 0, 1);
 
   if (ret_buf == NULL) {
diff --git a/src/help.c b/src/help.c
index 70cf8c6..3036d0a 100644
--- a/src/help.c
+++ b/src/help.c
@@ -34,8 +34,8 @@ int help(void)
   const char *s;
   char buf[40];
 
-  x1 = (COLS / 2) - 34;
-  x2 = (COLS / 2) + 32;
+  x1 = (MINICOM_COLS / 2) - 34;
+  x2 = (MINICOM_COLS / 2) + 32;
   w = mc_wopen(x1, 2, x2, 18, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
 
   s = _("Minicom Command Summary");
diff --git a/src/main.c b/src/main.c
index 85bd4a5..8f8e8f7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -485,17 +485,17 @@ void init_emul(int type, int do_init)
   }
 
   /* See if we have space for a fixed status line */
-  maxy = LINES - 1;
-  if ((use_status || LINES > 24) &&
+  maxy = MINICOM_LINES - 1;
+  if ((use_status || MINICOM_LINES > 24) &&
       P_STATLINE[0] == 'e') {
     if (use_status) {
-      ypos = LINES;
-      maxy = LINES - 1;
+      ypos = MINICOM_LINES;
+      maxy = MINICOM_LINES - 1;
     } else {
-      ypos = LINES - 1;
-      maxy = LINES - 2;
+      ypos = MINICOM_LINES - 1;
+      maxy = MINICOM_LINES - 2;
     }
-    st = mc_wopen(0, ypos, COLS - 1, ypos, BNONE,
+    st = mc_wopen(0, ypos, MINICOM_COLS - 1, ypos, BNONE,
                st_attr, sfcolor, sbcolor, 1, 0, 1);
     mc_wredraw(st, 1);
   }
@@ -508,7 +508,7 @@ void init_emul(int type, int do_init)
     num_hist_lines = 5000;
 
   /* Open a new main window, and define the configured history buffer size. */
-  us = mc_wopen(0, 0, COLS - 1, maxy,
+  us = mc_wopen(0, 0, MINICOM_COLS - 1, maxy,
               BNONE, XA_NORMAL, tfcolor, tbcolor, 1, num_hist_lines, 0);
 
   if (x >= 0) {
@@ -520,8 +520,8 @@ void init_emul(int type, int do_init)
   us->wrap = wrapln;
 
   terminal = type;
-  lines = LINES - (st != NULL);
-  cols = COLS;
+  lines = MINICOM_LINES - (st != NULL);
+  cols = MINICOM_COLS;
 
   /* Install and reset the terminal emulator. */
   if (do_init) {
@@ -583,10 +583,10 @@ static void show_status_fmt(const char *fmt)
   if (!st)
     return;
 
-  char buf[COLS];
+  char buf[MINICOM_COLS];
   int bufi = 0;
   int l = strlen(fmt);
-  for (int i = 0; i < l && bufi < COLS; ++i)
+  for (int i = 0; i < l && bufi < MINICOM_COLS; ++i)
     {
       if (fmt[i] == '%' && i + 1 < l)
         {
@@ -596,70 +596,70 @@ static void show_status_fmt(const char *fmt)
           switch (func)
             {
             case '%':
-              bufi += snprintf(buf + bufi, COLS - bufi, "%%");
+              bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "%%");
               break;
             case 'H':
-              bufi += snprintf(buf + bufi, COLS - bufi, "%sZ", esc_key());
+              bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "%sZ", esc_key());
               break;
             case 'V':
-              bufi += snprintf(buf + bufi, COLS - bufi, "%s", VERSION);
+              bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "%s", VERSION);
               break;
             case 'b':
 #ifdef USE_SOCKET
               if (portfd_is_socket == Socket_type_unix)
-                bufi += snprintf(buf + bufi, COLS - bufi, "unix-socket");
+                bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "unix-socket");
 	      else if (portfd_is_socket == Socket_type_tcp)
-                bufi += snprintf(buf + bufi, COLS - bufi, "TCP");
+                bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "TCP");
               else
 #endif /* USE_SOCKET */
                 {
                   if (P_SHOWSPD[0] == 'l')
-                    bufi += snprintf(buf + bufi, COLS - bufi, "%6ld", linespd);
+                    bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "%6ld", linespd);
                   else
-                    bufi += snprintf(buf + bufi, COLS - bufi, "%s", P_BAUDRATE);
-                  bufi += snprintf(buf + bufi, COLS - bufi, " %s%s%s",  P_BITS, P_PARITY, P_STOPB);
+                    bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "%s", P_BAUDRATE);
+                  bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, " %s%s%s",  P_BITS, P_PARITY, P_STOPB);
                 }
               break;
             case 'T':
               switch (terminal)
                 {
                 case VT100:
-                  bufi += snprintf(buf + bufi, COLS - bufi, "VT102");
+                  bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "VT102");
                   break;
                 case ANSI:
-                  bufi += snprintf(buf + bufi, COLS - bufi, "ANSI");
+                  bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "ANSI");
                   break;
                 }
 
               break;
             case 'C':
-              bufi += snprintf(buf + bufi, COLS - bufi, cursormode == NORMAL ? "NOR" : "APP");
+              bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, cursormode == NORMAL ? "NOR" : "APP");
               break;
 
 	    case 't':
               if (online < 0)
-                bufi += snprintf(buf + bufi, COLS - bufi, "%s",
+                bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "%s",
                                  P_HASDCD[0] == 'Y' ? _("Offline") : _("OFFLINE"));
               else
-                bufi += snprintf(buf + bufi, COLS - bufi, "%s %ld:%ld",
+                bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "%s %ld:%ld",
                                  P_HASDCD[0] == 'Y' ? _("Online") : _("ONLINE"),
                                  online / 3600, (online / 60) % 60);
               break;
 
             case 'D':
                 {
-                  char b[COLS - bufi];
-                  bufi += snprintf(buf + bufi, COLS - bufi, "%s",
+                  char b[MINICOM_COLS - bufi];
+                  bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "%s",
                                    shortened_devpath(b, sizeof(b), dial_tty));
                 }
               break;
 
             case '$':
-              bufi += snprintf(buf + bufi, COLS - bufi, "%s", status_message);
+              bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "%s", status_message);
               break;
 
             default:
-              bufi += snprintf(buf + bufi, COLS - bufi, "?%c", func);
+              bufi += snprintf(buf + bufi, MINICOM_COLS - bufi, "?%c", func);
               break;
             }
         }
@@ -670,9 +670,9 @@ static void show_status_fmt(const char *fmt)
         }
     }
 
-  if (bufi < COLS - 1)
-    memset(buf + bufi, ' ', COLS - bufi);
-  buf[COLS - 1] = 0;
+  if (bufi < MINICOM_COLS - 1)
+    memset(buf + bufi, ' ', MINICOM_COLS - bufi);
+  buf[MINICOM_COLS - 1] = 0;
 
   if (size_changed || !current_status_line || strcmp(buf, current_status_line))
     {
@@ -681,7 +681,7 @@ static void show_status_fmt(const char *fmt)
       mc_wprintf(st, "%s", buf);
       mc_wredraw(st, 1);
       ret_csr();
-      current_status_line = realloc(current_status_line, COLS);
+      current_status_line = realloc(current_status_line, MINICOM_COLS);
       assert(current_status_line);
       strcpy(current_status_line, buf);
     }
@@ -814,7 +814,7 @@ static void showtemp(void)
   if (st)
     return;
 
-  st = mc_wopen(0, LINES - 1, COLS - 1, LINES - 1,
+  st = mc_wopen(0, MINICOM_LINES - 1, MINICOM_COLS - 1, MINICOM_LINES - 1,
                 BNONE, st_attr, sfcolor, sbcolor, 1, 0, 1);
   show_status();
   tempst = 1;
diff --git a/src/minicom.c b/src/minicom.c
index cfdb763..d876cb2 100644
--- a/src/minicom.c
+++ b/src/minicom.c
@@ -1502,7 +1502,7 @@ int main(int argc, char **argv)
   if (win_init(tfcolor, tbcolor, XA_NORMAL) < 0)
     leave("");
 
-  if (COLS < 40 || LINES < 10)
+  if (MINICOM_COLS < 40 || MINICOM_LINES < 10)
     leave(_("Sorry. Your screen is too small.\n"));
 
   if (dosetup) {
diff --git a/src/vt100.c b/src/vt100.c
index 82e395e..2f03549 100644
--- a/src/vt100.c
+++ b/src/vt100.c
@@ -739,7 +739,7 @@ static void dec_mode(int on_off)
 
         if (on_off)
           {
-            us_alternate = mc_wopen(0, 0, COLS - 1, us->y2, BNONE, XA_NORMAL,
+            us_alternate = mc_wopen(0, 0, MINICOM_COLS - 1, us->y2, BNONE, XA_NORMAL,
                                     tfcolor, tbcolor,  1, 0, 0);
             vt_win = us_alternate;
           }
diff --git a/src/windiv.c b/src/windiv.c
index 2644dff..fb4d73c 100644
--- a/src/windiv.c
+++ b/src/windiv.c
@@ -48,8 +48,8 @@ static WIN *vmc_tell(const char *fmt, va_list va)
 
   vsnprintf(buf, sizeof(buf), fmt, va);
 
-  w = mc_wopen((COLS / 2) - 2 - mbswidth(buf) / 2, 8,
-	    (COLS / 2) + 2 + mbswidth(buf) / 2, 10,
+  w = mc_wopen((MINICOM_COLS / 2) - 2 - mbswidth(buf) / 2, 8,
+	    (MINICOM_COLS / 2) + 2 + mbswidth(buf) / 2, 10,
 	     BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
   mc_wcursor(w, CNONE);
   mc_wlocate(w, 2, 1);
@@ -104,7 +104,7 @@ int ask(const char *what, const char **s)
     size = mbswidth(what) / 2 + 2;
     offs = size - 5*num;
   }
-  w = mc_wopen((COLS / 2) - size , 8, (COLS / 2) + 1 + size, 9,
+  w = mc_wopen((MINICOM_COLS / 2) - size , 8, (MINICOM_COLS / 2) + 1 + size, 9,
              BSINGLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
 
   dirflush = 0;
@@ -167,7 +167,7 @@ char *input(char *s, char *buf, size_t bufsize)
 {
   WIN *w;
 
-  w = mc_wopen((COLS / 2) - 20, 11, (COLS / 2) + 20, 12,
+  w = mc_wopen((MINICOM_COLS / 2) - 20, 11, (MINICOM_COLS / 2) + 20, 12,
              BDOUBLE, stdattr, mfcolor, mbcolor, 1, 0, 1);
   mc_wputs(w, s);
   mc_wlocate(w, 0, 1);
diff --git a/src/window.c b/src/window.c
index c6cf0f1..66f2978 100644
--- a/src/window.c
+++ b/src/window.c
@@ -104,7 +104,7 @@ static int sflag = 0;
 
 int useattr = 1;
 int dirflush = 1;
-int LINES, COLS;
+int MINICOM_LINES, MINICOM_COLS;
 int usecolor = 0;
 WIN *stdwin;
 /*
@@ -266,12 +266,12 @@ static void _gotoxy(int x, int y)
   int tmp;
 
   /* Sanity check. */
-  if (x >= COLS || y > LINES || (x == curx && y == cury))
+  if (x >= MINICOM_COLS || y > MINICOM_LINES || (x == curx && y == cury))
     return;
 
   if (use_status) {
     /* Leaving status line? */
-    if (cury == LINES && y < cury) {
+    if (cury == MINICOM_LINES && y < cury) {
       outstr(FS);
       /* Re-set attributes. */
       tmp = curattr;
@@ -282,7 +282,7 @@ static void _gotoxy(int x, int y)
       return;
     }
     /* Writing on status line? */
-    else if (y == LINES) {
+    else if (y == MINICOM_LINES) {
       /* From normal screen? */
       if (cury < y) {
         outstr(tgoto(TS, x, x));
@@ -298,11 +298,11 @@ static void _gotoxy(int x, int y)
   }
 #else
   /* Sanity check. */
-  if (x >= COLS || y >= LINES || (x == curx && y == cury)) {
+  if (x >= MINICOM_COLS || y >= MINICOM_LINES || (x == curx && y == cury)) {
 #  if 0
-    if (x >= COLS || y >= LINES)
+    if (x >= MINICOM_COLS || y >= MINICOM_LINES)
       fprintf(stderr, "OOPS: (x, y) == (%d, %d)\n",
-          COLS, LINES);
+          MINICOM_COLS, MINICOM_LINES);
 #  endif
     return;
   }
@@ -345,7 +345,7 @@ static void _write(wchar_t c, int doit, int x, int y, char attr, char color)
    * last line, last character. After scrolling, this "invisible"
    * character is automatically restored.
    */
-  if (_has_am && y >= LINES - 1 && x >= COLS - 1) {
+  if (_has_am && y >= MINICOM_LINES - 1 && x >= MINICOM_COLS - 1) {
     doit = 0;
     sflag = 1;
     oldc.value = c;
@@ -353,9 +353,9 @@ static void _write(wchar_t c, int doit, int x, int y, char attr, char color)
     oldc.color = color;
   }
 #ifdef ST_LINE
-  if (x < COLS && y <= LINES)
+  if (x < MINICOM_COLS && y <= MINICOM_LINES)
 #else
-  if (x < COLS && y < LINES)
+  if (x < MINICOM_COLS && y < MINICOM_LINES)
 #endif
   {
     if (doit != 0) {
@@ -380,7 +380,7 @@ static void _write(wchar_t c, int doit, int x, int y, char attr, char color)
       curx++;
     }
     if (doit >= 0) {
-      e = &gmap[x + y * COLS];
+      e = &gmap[x + y * MINICOM_COLS];
       e->value = c;
       e->attr = attr;
       e->color = color;
@@ -428,7 +428,7 @@ void mc_wresize(WIN *win, int lines, int cols)
     for (x = 0; x < cols; x++) {
       n = &newmap[y + x * cols];
       if (x < win->xs && y < win->ys) {
-        e = &oldmap[y + x * COLS];
+        e = &oldmap[y + x * MINICOM_COLS];
         n->value = e->value;
         n->color = e->color;
         n->attr = e->attr;
@@ -446,8 +446,8 @@ void mc_wresize(WIN *win, int lines, int cols)
   free(oldmap);
   if (win == stdwin) {
     gmap = newmap;
-    LINES = lines;
-    COLS = cols;
+    MINICOM_LINES = lines;
+    MINICOM_COLS = cols;
   } else
     win->map = newmap;
 }
@@ -485,10 +485,10 @@ WIN *mc_wopen(int x1, int y1, int x2, int y2, int border, int attr,
   if (y1 < offs)
     y1 = offs;
 #if 0
-  if (x2 >= COLS - offs)
-    x2 = COLS - offs - 1;
-  if (y2 >= LINES - offs)
-    y2 = LINES - offs - 1;
+  if (x2 >= MINICOM_COLS - offs)
+    x2 = MINICOM_COLS - offs - 1;
+  if (y2 >= MINICOM_LINES - offs)
+    y2 = MINICOM_LINES - offs - 1;
 #endif
 
   w->xs = x2 - x1 + 1;
@@ -531,7 +531,7 @@ WIN *mc_wopen(int x1, int y1, int x2, int y2, int border, int attr,
   bytes = (x2 - x1 + 1) * sizeof(ELM);
   /* Loop */
   for (y = y1; y <= y2; y++) {
-    memcpy(e, gmap + COLS * y + x1, bytes);
+    memcpy(e, gmap + MINICOM_COLS * y + x1, bytes);
     e += (x2 - x1 + 1);
   }
 
@@ -649,7 +649,7 @@ void mc_wleave(void)
   ocursor = _curstype;
 
   setcbreak(0); /* Normal */
-  _gotoxy(0, LINES - 1);
+  _gotoxy(0, MINICOM_LINES - 1);
   _setattr(XA_NORMAL, COLATTR(WHITE, BLACK));
   _cursor(CNORMAL);
   if (CL != NULL)
@@ -688,8 +688,8 @@ void mc_wreturn(void)
   _cursor(ocursor);
 
   e = gmap;
-  for (y = 0; y <LINES; y++) {
-    for(x = 0; x < COLS; x++) {
+  for (y = 0; y <MINICOM_LINES; y++) {
+    for(x = 0; x < MINICOM_COLS; x++) {
       _write(e->value, -1, x, y, e->attr, e->color);
       e++;
     }
@@ -750,7 +750,7 @@ static int _wclreol(WIN *w)
 
   y = w->cury + w->y1;
 
-  if (w->direct && (w->x2 == COLS - 1) && CE) {
+  if (w->direct && (w->x2 == MINICOM_COLS - 1) && CE) {
     _gotoxy(w->curx + w->x1, y);
     _setattr(w->attr, w->color);
     outstr(CE);
@@ -779,12 +779,12 @@ void mc_wscroll(WIN *win, int dir)
    * This improves performance on slow screens (eg ATARI ST) dramatically.
    */
   if (win->direct && SF != NULL &&
-      (dir == S_UP || SR != NULL) && (LINES == win->sy2 - win->sy1 + 1)) {
+      (dir == S_UP || SR != NULL) && (MINICOM_LINES == win->sy2 - win->sy1 + 1)) {
     doit = 0;
     phys_scr = 1;
     _setattr(win->attr, win->color);
     if (dir == S_UP) {
-      _gotoxy(0, LINES - 1);
+      _gotoxy(0, MINICOM_LINES - 1);
       outstr(SF);
     } else {
       _gotoxy(0, 0);
@@ -795,7 +795,7 @@ void mc_wscroll(WIN *win, int dir)
    * If the window is as wide as the physical screen, we can
    * scroll it with insert/delete line (or set scroll region - vt100!)
    */
-  else if (win->direct && win->xs == COLS &&
+  else if (win->direct && win->xs == MINICOM_COLS &&
       ((CS != NULL && SF != NULL && SR != NULL)
        || (Dl != NULL && Al != NULL))) {
     doit = 0;
@@ -806,7 +806,7 @@ void mc_wscroll(WIN *win, int dir)
        * big as the physical screen, we don't _have_ to
        * initialize it.
        */
-      if (win->sy2 == LINES - 1 && win->sy1 == 0)
+      if (win->sy2 == MINICOM_LINES - 1 && win->sy1 == 0)
         fs = 1;
       if (!fs) {
         outstr(tgoto(CS, win->sy2, win->sy1));
@@ -820,7 +820,7 @@ void mc_wscroll(WIN *win, int dir)
         outstr(SR);
       }
       if (!fs) {
-        outstr(tgoto(CS, LINES - 1, 0));
+        outstr(tgoto(CS, MINICOM_LINES - 1, 0));
         cury = 0;
       }
       _gotoxy(0, win->sy2);
@@ -843,9 +843,9 @@ void mc_wscroll(WIN *win, int dir)
    * to the lower right. After scrolling we have to restore
    * the non-visible character that is now visible.
    */
-  if (sflag && win->sy2 == (LINES - 1) && win->sy1 != win->sy2) {
+  if (sflag && win->sy2 == (MINICOM_LINES - 1) && win->sy1 != win->sy2) {
     if (dir == S_UP) {
-      _write(oldc.value, 1, COLS - 1, LINES - 2,
+      _write(oldc.value, 1, MINICOM_COLS - 1, MINICOM_LINES - 2,
              oldc.attr, oldc.color);
     }
     sflag = 0;
@@ -858,7 +858,7 @@ void mc_wscroll(WIN *win, int dir)
       win->sy2 == win->y2 && win->sy1 == win->y1) {
 
     /* Calculate screen buffer */
-    e = gmap + win->y1 * COLS + win->x1;
+    e = gmap + win->y1 * MINICOM_COLS + win->x1;
 
     /* Calculate history buffer */
     f = win->histbuf + (win->xs * win->histline);
@@ -903,7 +903,7 @@ void mc_wscroll(WIN *win, int dir)
     /* Now scroll the memory image. */
     if (dir == S_UP) {
       for (y = win->sy1 + 1; y <= win->sy2; y++) {
-        e = gmap + y * COLS + win->x1;
+        e = gmap + y * MINICOM_COLS + win->x1;
         for (x = win->x1; x <= win->x2; x++) {
           _write(e->value, win->direct && doit, x, y - 1, e->attr, e->color);
           e++;
@@ -915,7 +915,7 @@ void mc_wscroll(WIN *win, int dir)
         _wclreol(win);
     } else {
       for (y = win->sy2 - 1; y >= win->sy1; y--) {
-        e = gmap + y * COLS + win->x1;
+        e = gmap + y * MINICOM_COLS + win->x1;
         for (x = win->x1; x <= win->x2; x++) {
           _write(e->value, win->direct && doit, x, y + 1, e->attr, e->color);
           e++;
@@ -1195,7 +1195,7 @@ void mc_wcurbar(WIN *w, int y, int attr)
 
   y += w->y1;
 
-  e = gmap + y * COLS + w->x1;
+  e = gmap + y * MINICOM_COLS + w->x1;
 
   /* If we can't do reverse, just put a '>' in front of
    * the line. We only support XA_NORMAL & XA_REVERSE.
@@ -1447,7 +1447,7 @@ void mc_winclr(WIN *w)
     /* contains them for cosmetic purposes or as separators. */
     for (m = w->y2; m >= w->y1; m--) {
       /* Start of this line in the global map. */
-      e = gmap + m * COLS + w->x1;
+      e = gmap + m * MINICOM_COLS + w->x1;
 
       /* Quick check to see if line is empty. */
       for (i = 0; i < w->xs; i++)
@@ -1461,7 +1461,7 @@ void mc_winclr(WIN *w)
     /* Copy window into history buffer line-by-line. */
     for (y = w->y1; y <= m; y++) {
       /* Start of this line in the global map. */
-      e = gmap + y * COLS + w->x1;
+      e = gmap + y * MINICOM_COLS + w->x1;
 
       /* Now copy this line. */
       f = w->histbuf + (w->xs * w->histline); /* History buffer */
@@ -1475,7 +1475,7 @@ void mc_winclr(WIN *w)
   _setattr(w->attr, w->color);
   w->curx = 0;
 
-  if (CL && w->y1 == 0 && w->y2 == LINES-1 && w->x1 == 0 && w->x2 == COLS-1) {
+  if (CL && w->y1 == 0 && w->y2 == MINICOM_LINES-1 && w->x1 == 0 && w->x2 == MINICOM_COLS-1) {
     w->direct = 0;
     curx = 0;
     cury = 0;
@@ -1567,7 +1567,7 @@ void mc_winschar2(WIN *w, wchar_t c, int move)
   }
 
   odir = w->direct;
-  if (w->xs == COLS && IC != NULL) {
+  if (w->xs == MINICOM_COLS && IC != NULL) {
     /* We can use the insert character capability. */
     if (w->direct)
       outstr(IC);
@@ -1589,7 +1589,7 @@ void mc_winschar2(WIN *w, wchar_t c, int move)
   buf = malloc(sizeof(ELM) * len);
   if (!buf)
     return; /* Umm... */
-  memcpy(buf, gmap + COLS * y + x, sizeof(ELM) * len);
+  memcpy(buf, gmap + MINICOM_COLS * y + x, sizeof(ELM) * len);
 
   /* Now, put the new character on screen. */
   mc_wputc(w, c);
@@ -1625,14 +1625,14 @@ void mc_wdelchar(WIN *w)
   x = w->x1 + w->curx;
   y = w->y1 + w->cury;
 
-  if (w->direct && w->xs == COLS && DC != NULL) {
+  if (w->direct && w->xs == MINICOM_COLS && DC != NULL) {
     /*_gotoxy(x - 1, y);*/
     _gotoxy(x, y);
     outstr(DC);
     doit = 0;
   }
 
-  e = gmap + y * COLS + x + 1;
+  e = gmap + y * MINICOM_COLS + x + 1;
 
   for (; x < w->x2; x++) {
     _write(e->value, doit && w->direct, x, y, e->attr, e->color);
@@ -1906,16 +1906,16 @@ int win_init(int fg, int bg, int attr)
     fprintf(stderr, _("No cursor motion capability (cm)\n"));
     return -1;
   }
-  LINES = COLS = 0;
-  getrowcols(&LINES, &COLS);
+  MINICOM_LINES = MINICOM_COLS = 0;
+  getrowcols(&MINICOM_LINES, &MINICOM_COLS);
 #ifdef BBS
-  LINES = lines;
+  MINICOM_LINES = lines;
 #endif
-  if (LINES == 0 && (LINES = tgetnum("li")) <= 0) {
+  if (MINICOM_LINES == 0 && (MINICOM_LINES = tgetnum("li")) <= 0) {
     fprintf(stderr, _("Number of terminal lines unknown\n"));
     return -1;
   }
-  if (COLS == 0 && (COLS = tgetnum("co")) <= 0) {
+  if (MINICOM_COLS == 0 && (MINICOM_COLS = tgetnum("co")) <= 0) {
     fprintf(stderr, _("Number of terminal columns unknown\n"));
     return -1;
   }
@@ -2053,7 +2053,7 @@ int win_init(int fg, int bg, int attr)
 
 
   /* Memory for global map */
-  if ((gmap = malloc(sizeof(ELM) * (LINES + 1) * COLS)) == NULL) {
+  if ((gmap = malloc(sizeof(ELM) * (MINICOM_LINES + 1) * MINICOM_COLS)) == NULL) {
     fprintf(stderr, _("Not enough memory\n"));
     return -1;
   };
@@ -2068,10 +2068,10 @@ int win_init(int fg, int bg, int attr)
   stdwin->doscroll = 1;
   stdwin->x1       = 0;
   stdwin->sy1      = stdwin->y1 = 0;
-  stdwin->x2       = COLS - 1;
-  stdwin->sy2      = stdwin->y2 = LINES - 1;
-  stdwin->xs       = COLS;
-  stdwin->ys       = LINES;
+  stdwin->x2       = MINICOM_COLS - 1;
+  stdwin->sy2      = stdwin->y2 = MINICOM_LINES - 1;
+  stdwin->xs       = MINICOM_COLS;
+  stdwin->ys       = MINICOM_LINES;
   stdwin->attr     = attr;
   stdwin->color    = COLATTR(fg, bg);
   stdwin->direct   = 1;
diff --git a/src/window.h b/src/window.h
index 1b8eb12..97f3bdd 100644
--- a/src/window.h
+++ b/src/window.h
@@ -62,7 +62,7 @@ typedef struct _win {
  * Stdwin is the whole screen
  */
 extern WIN *stdwin;	/* Whole screen */
-extern int LINES, COLS; /* Size of screen */
+extern int MINICOM_LINES, MINICOM_COLS; /* Size of screen */
 extern int usecolor;	/* Use ansi color escape sequences */
 extern int useattr;	/* Use attributes (reverse, bold etc. ) */
 extern int dirflush;	/* Direct flush after write */
-- 
2.25.0

