delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2004/09/25/06:01:31

X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f
From: aniruddha1981 AT yahoo DOT co DOT in (Aniruddha)
Newsgroups: comp.os.msdos.djgpp
Subject: Re: weird problem with printf()
Date: 25 Sep 2004 02:54:49 -0700
Organization: http://groups.google.com
Lines: 239
Message-ID: <59493f32.0409250154.40205e18@posting.google.com>
References: <59493f32 DOT 0409200155 DOT 7ad6ec60 AT posting DOT google DOT com> <2r7rjrF17idfoU2 AT uni-berlin DOT de> <01c49f45$Blat.v2.2.2$e4b2cf20 AT zahav DOT net DOT il>
NNTP-Posting-Host: 202.9.150.141
X-Trace: posting.google.com 1096106089 10725 127.0.0.1 (25 Sep 2004 09:54:49 GMT)
X-Complaints-To: groups-abuse AT google DOT com
NNTP-Posting-Date: Sat, 25 Sep 2004 09:54:49 +0000 (UTC)
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

> Probably.  So the way to unlock this mystery would be to find the
> shortest subset of the OP's original program that still exhibits this
> behavior, then post the source here.

I tried to reduce the program, what I noticed was, when I comment this
function it works as expected. The function and one more associated
function is as
follows, but I dont know whether it is still too big to post.

size_t getCmdLine (char *cmdLine, int leftMargin, int *hIndex)
{
  int       icmd = 0;           /* Index of command line i.e current
cursor
                                   position. 0 indicates first char
after the
                                   left margin */
  BOOL      inInsMode = FALSE;  /* Flag to indicate that INSERT
pressed */
  int       cmdLen = 0;         /* Length of command line */
  int       key = 0;            /* The key pressed */
  int       i;
  char      startRow;           /* The starting row number */
  int       upArrowCnt = 0;     /* Number of times Up arrow is pressed
*/
  int       tmp;

  _setcursortype (_NORMALCURSOR);       /* Initially normal cursor */
  startRow = wherey () - 1;     /* Wherey returns the current row -
starts
                                   from 1, but the setCursor func
requires 0
                                   based row */
  /* In this function the current Row is not kept track, instead the
     ScreenSetCursor function is used to position the cursor by
starting from
     the start row, it can handle the case when the column is greater
than
     NUM_COLS(defined as 80).*/
  for (;;)
    {
      switch (key = getKey ()) /* getKey returns an integer value for
the key pressed */
        {
        case ENTER:
          cmdLine[cmdLen] = '\0';       /* Nul terminate */
          /* Move cursor to the end of cmd line, as editing may have
occured
             somewhere inbetween */
          i = ceil ((double) cmdLen / NUM_COLS);
          ScreenSetCursor (startRow + i, 0);
          return strlen (cmdLine);

        case ARROWLEFT:
          if (icmd)
            icmd--;             /* cannot go negative */
          else
            {
              beep ();
              break;
            }
          ScreenSetCursor (startRow, icmd + leftMargin);
          break;

        case ARROWRIGHT:
          if (icmd < cmdLen)
            icmd++;             /* cannot move past the end of command
line */
          else
            {
              beep ();
              break;
            }
          ScreenSetCursor (startRow, icmd + leftMargin);
          break;

        case INSERT:
          /* Change the cursor and set a flag */
          if (inInsMode == TRUE)
            {
              _setcursortype (_NORMALCURSOR);
              inInsMode = FALSE;
            }
          else
            {
              _setcursortype (_SOLIDCURSOR);
              inInsMode = TRUE;
            }
          break;

        case DELETE:
          /* Start deleting from the cur pos of cursor */
          for (i = icmd; i < cmdLen; i++)
            cmdLine[i] = cmdLine[i + 1];        /* Move left by 1 */
          cmdLine[cmdLen - 1] = '\0';
          clearAndDispCmdLine (cmdLine, cmdLen, startRow, leftMargin);
          /* Deletion doesn't change the index(icmd), but reduces len
*/
          cmdLen--;
          ScreenSetCursor (startRow, leftMargin + icmd);
          break;

        case HOME:
          /* Move to the beginning of cmd line */
          ScreenSetCursor (startRow, leftMargin);
          icmd = 0;
          break;

        case END:
          /* Move to the end of cmd line */
          ScreenSetCursor (startRow, leftMargin + cmdLen);
          icmd = cmdLen;
          break;

        case BACKSPACE:
          /* At the beginning of the command cannot press BACKSPACE */
          if (icmd == 0)
            {
              beep ();
              break;
            }
          for (i = icmd - 1; i < cmdLen; i++)
            cmdLine[i] = cmdLine[i + 1];        /* Move left by 1 */
          cmdLine[cmdLen - 1] = '\0';
          /* The len is reduced only after the display function is
called as
             it should remove other trailing chars from screen */
          clearAndDispCmdLine (cmdLine, cmdLen, startRow, leftMargin);
          icmd--;
          cmdLen--;
          ScreenSetCursor (startRow, leftMargin + icmd);
          break;

        default:
          /* Make place for the cur key by moving others(after cur
cursor pos)
             to the right */
          if (inInsMode == FALSE)
            {
              /* If editing somewhere in between the command, move
other
                 characters after cursor to the right */
              if (icmd < cmdLen)
                {
                  for (i = cmdLen + 1; i > icmd; i--)
                    cmdLine[i] = cmdLine[i - 1];        /* From end
copy prev
                                                           char */
                }
              cmdLine[icmd++] = key;
              cmdLen++;
              cmdLine[cmdLen] = '\0';
            }
          else
            {
              /* If inside insert mode - rewrite Don't change cmd len
if
                 cursor in between the string */
              cmdLine[icmd++] = key;
              /* if insertion at the end of string - len increases */
              if (icmd > cmdLen)
                cmdLen++;
              cmdLine[cmdLen] = '\0';
            }
          clearAndDispCmdLine (cmdLine, cmdLen, startRow, leftMargin);
          ScreenSetCursor (startRow, leftMargin + icmd);
          break;

        case ARROWUP:
          /* Display prev command from cmd history */
          tmp = *hIndex;        /* Display the cmd at cur Index */
          /* Can go UP MAX_HISTORY times */
          if (tmp < 0 || upArrowCnt == MAX_HISTORY)
            {
              beep ();
              break;
            }
          *hIndex = (*hIndex + MAX_HISTORY - 1) % MAX_HISTORY;
          strcpy (cmdLine, cmdHistory[tmp]);
          /* Send prev cmdLen to clear&disp func */
          clearAndDispCmdLine (cmdLine, cmdLen, startRow, leftMargin);
          cmdLen = strlen (cmdHistory[tmp]);    /* Set the length,
after
                                                   display */
          icmd = cmdLen;
          upArrowCnt++;
          break;

        case ARROWDOWN:
          /* Display next command from cmd history */
          if (upArrowCnt)
            {
              tmp = (*hIndex + 1) % MAX_HISTORY;
              strcpy (cmdLine, cmdHistory[tmp + 1]);
              /* Prev command len is sent to the clr&disp func */
              clearAndDispCmdLine (cmdLine, cmdLen, startRow,
leftMargin);
              cmdLen = strlen (cmdHistory[tmp + 1]);    /* Set the
length */
              icmd = cmdLen;
              *hIndex = tmp;
              upArrowCnt--;
            }
          else
            beep ();
          break;

        }                       /* end switch */
    }                           /* end for (;;) */
}                               /* end function {getCmdLine} */


void clearAndDispCmdLine (char *cmdLine, int cmdLen, int startRow,
                          int leftMargin)
{
  int       i;

  /* The length passed to this function is that before the editing is
done so
     that if len number of spaces are put, it is ensured to clear the
whole
     command line. */
  ScreenSetCursor (startRow, leftMargin);       /* move to start */
  for (i = leftMargin; i < cmdLen + leftMargin; i++)
    putchar (' ');              /* clear the cur command line */
  fflush (stdout);              
  ScreenSetCursor (startRow, leftMargin);       /* move back */
  printf ("%s", cmdLine);
}


I call this function like:
int i;
int hIndex = -1;
char cmd[160]={0};

i=printf ("command>");
getCmdLine (cmd,i,&hIndex);

Thanks.

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019