Advertisement
PierrotLL

input

May 4th, 2013
422
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.52 KB | None | 0 0
  1. void input(char* str, int x, int y, int width) {
  2.     const unsigned int sc013A[] = { 0xD201D002, 0x422B0009, 0x80010070, 0x013A }; // syscall to display OS cursor
  3.     #define Cursor_SetFlashMode ((void(*)(int))sc013A)
  4.     #define INPUT_BUFFER_SIZE 1024
  5.     char buffer[INPUT_BUFFER_SIZE];
  6.     int run=1, key, i, cursor=0, length=0, displayStart=0;
  7.     buffer[0] = 0;
  8.     Cursor_SetFlashMode(1); // enable OS cursor
  9.     while(run) {
  10.         if (cursor && cursor <= displayStart) displayStart = cursor-1;
  11.         if (cursor-displayStart >= width) displayStart = cursor-width+1;
  12.         locate(x, y);
  13.         PrintLine(buffer + displayStart, x+width-1); // display string
  14.         if (length-displayStart < width) {
  15.             locate(x+length-displayStart, y);
  16.             Print(" "); // clear old last character in case of removal
  17.         }
  18.         locate(x+cursor-displayStart, y); // set position of displayed cursor
  19.         GetKey(&key);
  20.         switch (key) {
  21.             case KEY_CTRL_LEFT:
  22.                 if (cursor) cursor--;
  23.                 break;
  24.             case KEY_CTRL_RIGHT:
  25.                 if (cursor < length) cursor++;
  26.                 break;
  27.             case KEY_CTRL_EXE:
  28.                 run = 0;
  29.                 break;
  30.             case KEY_CTRL_DEL:
  31.                 if (cursor) cursor--;
  32.                 for (i=cursor ; i<length ; i++)
  33.                     buffer[i] = buffer[i+1];
  34.                 if (length) length--;
  35.                 break;
  36.             default:
  37.                 if (key >= 32 && key < 127 && length+1 < INPUT_BUFFER_SIZE) { // if ASCII char
  38.                     for (i=length ; i>=cursor ; i--)
  39.                         buffer[i+1] = buffer[i];
  40.                     buffer[cursor] = key;
  41.                     cursor++;
  42.                     length++;
  43.                 }
  44.         }
  45.     }
  46.     Cursor_SetFlashMode(0);
  47.     for (i=0 ; i<=length ; i++) {
  48.         str[i] = buffer[i];
  49.     }
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement