/* array member of the buffer. */
/* Also test for the top and bottom of the history file. */
+/* Error function. */
+void error(void)
+{
+ printf("Error \n");
+}
+
+
/* Display a buffer */
void show(buf b)
}
else
{
- memset(b.array[0], 0, sizeof(b.array) );
+ memset(&b.array[0], 0, sizeof(b.array) );
b.array[0] = i;
b.index += 1 ;
}
}
+/* Return a line from hist. */
+buf get(hist h)
+{
+ buf b;
+ memcpy(&b.array[0], h.array[h.curindex], 80);
+ return b;
+}
+
+
/* Move up in history list. */
-buf up(buf b)
+hist up(hist h)
{
+
+ buf b;
+
+ if ( (h.curindex > 0) )
+ {
+ h.curindex -= 1;
+ memset(&b.array[0], 0, sizeof(b.array) );
+ memcpy(&b.array[0], h.array[h.curindex], 80);
+ show(b);
+ return h;
+ }
+
+ else error();
-
-
}
/* Move down in history list. */
-buf down(buf b)
+hist down(hist h)
{
-
-
+
+ buf b;
+
+ if ( (h.curindex < 19) )
+ {
+ h.curindex += 1;
+ memset(&b.array[0], 0, sizeof(b.array) );
+ memcpy(&b.array[0], h.array[h.curindex], 80);
+ show(b);
+ return h;
+ }
+
+ else error();
+
}
/* Function for special key combinations */
/* (Ctrl, Alt, function keys. */
-void spec(void)
+void spec(hist h)
{
int j = getch();
-
- if ( ( j == 65 ) ) printf("Up ");
- else if ( ( j == 66 ) ) printf("Down ");
+
+ if ( ( j == 65 ) ) up(h);
+ else if ( ( j == 66 ) ) down(h);
else if ( ( j == 67 ) ) printf("Right ");
else if ( ( j == 68 ) ) printf("Left ");
}
-/* An array to store the command-history file in. */
-/* Only 20 lines are read. */
-char hist[20][80];
-
-
-/* Read the file into the array of strings. */
-buf readhistory(char *fname)
+/* Read the file into the array of strings. */
+hist readhistory(char *fname)
{
/* Create a history buffer. */
- buf h;
+ hist h;
int retval = fexists(fname);
for(i=0; i<20; i++)
{
fgets(line, 80, fptr);
- chop(line) ;
- memcpy(hist[i], line, 80) ;
- puts(hist[i]);
+ chop(line) ;
+
+ /* TO DO: fix the "too few arguments" bug here.... */
+ memcpy(&h.array[i], line, 80) ;
+ puts(h.array[i]);
}
} /* retval == 0 */
else puts("Error! File does not exist. \n");
-
- /* Read the most recent command into histbuf */
- /* and set the index to 19. */
- /*
- h.index = 19;
- h.array = hist[h.index] ;
- */
-
+
+ /* Set the curindex to 19. */
+ h.curindex = 19;
+
return h;
}
/* Alt keys are just esc then key (e.g. Alt-g is esc g ). */
/* Ctrl (then letter) keys are just Dec 1 to Dec 26 */
-void keyhandler(buf b)
+void keyhandler(buf b, hist h)
{
int a = getch();
case (1): break; /* Ctrl a */
case (2): break; /* Ctrl b */
- case (3): getch(); spec(); break; /* Ctrl c */
+ case (3): getch(); spec(h); break; /* Ctrl c */
case (4): set(b, a); break; /* Printable chars. */
case (5): delch(b); break;
case (6): break;
/* Read in the command history file. */
- buf histbuf = readhistory("test.txt");
+ hist myhist = readhistory("test.txt");
while(1)
{
- keyhandler(mybuf);
+ keyhandler(mybuf, myhist);
}
} buf;
+/* History. */
+typedef struct {
+ int curindex;
+ char array[20][80];
+} hist;
+
+
+
+
+/* Termios funcs. */
+void initTermios(int echo) ;
+void resetTermios(void) ;
+char getch_(int echo);
+char getch(void);
+char getche(void);
+
/* Buffer funcs. */
-buf set(buf b, int i);
+void error(void);
void show(buf b);
-buf up(buf b);
-buf down(buf b);
+buf set(buf b, int i);
+buf get(hist h);
+
+hist up(hist h);
+hist down(hist h);
buf left(buf b);
buf right(buf b);
buf delch(buf b);
/* Special key handling. */
-void spec(void);
+void spec(hist h);
/* Other funcs. */
-buf readhistory(char *fname);
-void keyhandler(buf b);
+hist readhistory(char *fname);
+void keyhandler(buf b, hist h);