NO

Author Topic: fatal error: Internal error: function _label: Bad terminal 8331  (Read 4255 times)

belimax

  • Guest
Hello,

I'm trying to convert a static C library from lcc-win32 to Pelles C and I get this error when building the project on a subroutine declaration.
Here is the faulting subroutine.

#--------------------------------------------------------------------------------
Accept is a generic input routine to accept input from the user

  Parameters: Row, Column, Color, Prompt, Length of return, Validate,
              Return string

   Set length of return to negative to hide input
   Set color to negative to prevent altering default on ESC
       color contains foreground and background (bg * 16 + fg)
   Set return string to provide default
   Return Codes:         0: ESC
                         1: Enter
                         2: Up arrow
                         3: Down arrow
                         4: Page up
                         5: Page down
                   59 - 68:      Function Keys 1 - 10
                 104 - 113: Alt  Function Keys 1 - 10
                  94 - 103: Ctrl Function Keys 1 - 10

 Example: z = Accept(5,30,-14,"Prompt -> ",6,"ABCwz#-+{}0123456789",ret)
#--------------------------------------------------------------------------------

extern int Accept(int,int,int,char *,int,char *,char *);

extern int Accept(int row,int col,int clr,char *prompt,int length,char *validate,char *rts) {
static unsigned char orig[82],k;
static int                hide,s,cp,ep,ins,rcd,cx,cy;
CONSOLE_CURSOR_INFO cci,cco;

if (length < 0) {length = -length; hide = 1; rts[0] = 0;} else {hide = 0;}

hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsole,&binfo);
if (col < 1 || row < 1) return 0;
if ((col + strlen(prompt) + length) > 80) return 0;
if (row > binfo.dwSize.Y) return 0;

sprintf((char *) orig,"%s",left(rts,length));
sprintf(rts,"%s",orig);

ScreenGetCursor(&cx,&cy); locate(row,col);
GetConsoleCursorInfo(hConsole,&cci);
cco = cci; cci.dwSize = 90; cci.bVisible = TRUE;
SetConsoleCursorInfo(hConsole,&cci);
printf("%s",prompt); color((int)Abs(clr) & 15,((int)Abs(clr) >> 4) & 15);
printf("%s%s",rts,space(length - strlen(rts)));
s = 1; cp = col + strlen(prompt); ep = cp; rcd = 1; ins = 0;

do {
   locate(row,cp);
   k = _getch();
   if (k == 224 || k == 0) {      /* A function type key was pressed */
      k = _getch();
      if (hide == 0) {
         switch(k) {
            case 71:               /* Home key pressed        */
               cp = ep; k = 128;
               break;
            case 79:               /* End key pressed         */
               cp = ep + strlen(rts); k = 128;
               break;
            case 75:               /* Left arrow key pressed  */
               if (cp == ep) {rcd = 6; k = 13; break;}
               if (cp > ep) cp--; k = 128; break;
            case 77:               /* Right arrow key pressed */
               if (cp == ep && s != 0) {rcd = 7; k = 13; break;}
               if (cp < (ep + strlen(rts))) {cp++; k = 128;}
               else {rcd = 7; k = 13;}
               break;
            case 72:               /* Up arrow key pressed    */
               rcd = 2; k = 13;
               break;
            case 80:               /* Down arrow key pressed  */
               rcd = 3; k = 13;
               break;
            case 73:               /* Page Up key pressed     */
               rcd = 4; k = 13;
               break;
            case 81:               /* Page Down key pressed   */
               rcd = 5; k = 13;
               break;
            case 82:               /* Insert key pressed      */
               ins = 1 - ins; k = 128;
               if (ins) cci.dwSize = 20;
               else cci.dwSize = 90;
               SetConsoleCursorInfo(hConsole,&cci);
               break;
            case 83:               /* Delete key pressed      */
               if (s) {
                  cp = ep; rts[0] = 0; locate(row,cp);
                  printf("%s",space(length));
               }
               else {
                  if ((cp - ep) < strlen(rts)) {
                     s = cp - ep;
                     sprintf(rts,"%s%s",left(rts,s),mid(rts,s + 2));
                     locate(row,ep);
                     printf("%s%s",rts,space(length - strlen(rts)));
                  }
               }
               k = 128;
               break;
            default:
               rcd = k; k = 13;
               break;
         }
      }
      else {
         k = 128;
      }
      s = 0;
   }
   if (k == 8 && cp > ep) {        /* Backspace key pressed  */
      s = cp - ep; memcpy(rts + s - 1,rts + s,length - s + 1);
      cp--; s = 0;
      if (hide) {
         locate(row,cp); _putch(32);
      }
      else {
         locate(row,ep); printf("%s%s",rts,space(length - strlen(rts)));
      }
   }
   if (k == 27) {rcd = 0; k = 13;} /* Escape key pressed    */
   if (instr((char *) validate,(char *) &k)) {
      if (cp - ep < length) {
         if (s) {
            rts[0] = 0; rts[1] = 0;
            printf(space(length)); locate(row,cp);
         }
         s = cp - ep;
         if (s == strlen(rts)) {
            rts[s++] = k; rts = 0;
         }
         else {
            if (ins) {
               memcpy(rts + s + 1,rts + s,length - s + 1);
               rts = k; rts[length] = 0;
               locate(row,ep); printf("%s",rts); locate(row,cp);
            }
            else {
               rts = k;
            }
         }
         s = 0; cp++;
         if (hide) {_putch(42);} else {_putch(k);}
      }
   }
} while (k != 13);
if (rcd == 0 && clr < 0) sprintf(rts,"%s",orig);
locate(cx,cy); SetConsoleCursorInfo(hConsole,&cco);
return rcd;
}
« Last Edit: March 15, 2011, 09:43:08 PM by belimax »

Offline AlexN

  • Global Moderator
  • Member
  • *****
  • Posts: 394
    • Alex's Link Sammlung
Re: fatal error: Internal error: function _label: Bad terminal 8331
« Reply #1 on: March 14, 2011, 08:06:55 AM »
When I try to compile the code you add to your post, I don't get this error (but I get to many errors to compile it complete).

But Pelles C has a stricter type checking than lcc-win32, to ignore this can raise some errors. Try to remove the warnings, perhaps it then works better.
best regards
 Alex ;)

belimax

  • Guest
Re: fatal error: Internal error: function _label: Bad terminal 8331
« Reply #2 on: March 15, 2011, 06:49:44 PM »
Hi AlexN,
Thank you for your response.

I made a break down of C code and found that it was the second call to the function "SetConsoleCursorInfo(hConsole,&cci)" the reason of this error.

If I suppress this line, compile runs OK.
I erased the line, retype it fully in case of non displayable character but I always get the same error.

I will try later to replace it by a call to a subroutine containing the statement.

belimax

  • Guest
Re: fatal error: Internal error: function _label: Bad terminal 8331
« Reply #3 on: March 15, 2011, 09:42:27 PM »
Hi,

This error disappear when I remove optimization. In fact any optimization brings up this message.

Offline AlexN

  • Global Moderator
  • Member
  • *****
  • Posts: 394
    • Alex's Link Sammlung
Re: fatal error: Internal error: function _label: Bad terminal 8331
« Reply #4 on: March 17, 2011, 08:02:04 AM »
Hi,

This error disappear when I remove optimization. In fact any optimization brings up this message.
Since Pelle has not visited the forum for a long time (last time was 28.11.2010), there it is not to expect that there will be a fast remedying of this error.

So an easy workaround will be to switch the optimization off before the fault line and switch it on after. ;)
best regards
 Alex ;)

Offline Pelle

  • Administrator
  • Member
  • *****
  • Posts: 2266
    • http://www.smorgasbordet.com
Re: fatal error: Internal error: function _label: Bad terminal 8331
« Reply #5 on: April 17, 2011, 04:07:21 PM »
Can't even compile it due to syntax errors. Ignored; try again.
/Pelle