#include #include #include #include "config.h" #include "interface.h" #include "terminal.h" #include "exceptions.h" #include "parser.h" #include "pile.h" int quit; char *ancien = NULL; /* * Ces deux fonctions nous servent a inserer ou supprimer un caractere dans une chaine. Utile pour * l'utilisation des touches backspace, suppr et insert */ void supprime(char *ch) { for (; *ch; ch++) { *ch = *(ch + 1); } } void inserer(char *ch, char c) { int i; ch[strlen(ch) + 1] = '\0'; for (i = strlen(ch) - 1; i != -1; i--) { *(ch + i + 1) = *(ch + i); } *ch = c; } /* * La boucle de l'interface. Meme si elle a l'air longue, elle ne fait que tester les differents * cas en fonction des touches enfoncees. */ void ifloop(void) { int cread, i, insert = 0; int gotesc = 0; char buffer[BUFSIZ] = ""; int position = 0; printf("> "); quit = 0; while (!quit) { cread = fgetc(input); if (gotesc) { switch (cread) { case 91: cread = fgetc(input); switch (cread) { case 49: /* * Home */ position = 0; break; case 50: /* * Insert */ insert ^= 1; break; case 52: /* * End */ printf("%s", &(buffer[position])); position = strlen(buffer); break; case 67: /* * Droite */ if (buffer[position]) { printf("%c", buffer[position++]); } break; case 68: /* * Gauche */ if (position) { printf("\010"); position--; } break; default: gotesc = 0; break; } break; case 79: cread = fgetc(input); switch (cread) { case 82: /* * F3 */ for (i = 0; i < position; i++) { printf("\010"); } strcpy(buffer, ancien); position = strlen(buffer); printf("%s", buffer); break; default: gotesc = 0; break; } break; default: gotesc = 0; break; } if (gotesc) { cread = fgetc(input); gotesc = 0; } } switch (cread) { case 3: /* * CTRL-C */ printf(_("*CTRL-C*\n")); quit = 1; break; case 8: /* * backspace */ if (position) { supprime(&(buffer[--position])); printf("\010%s ", &(buffer[position])); for (i = 0; i <= strlen(&(buffer[position])); i++) { printf("\010"); } } break; case 10: /* * Entree */ printf("\n"); clearterm(); if (ancien) free(ancien); ancien = Estrdup(buffer); parse_line(buffer); if (quit) break; initterm(); position = 0; buffer[0] = 0; printf("\n"); while (has_resultat()) { printf(" . %s\n", pop_resultat()); } printf("\n> "); global_error = 0; break; case 27: /* * ESC */ gotesc = 1; break; case 126: /* * ~ */ break; case 127: /* * Suppr */ if (buffer[position]) { supprime(&(buffer[position])); } printf("%s ", &(buffer[position])); for (i = 0; i <= strlen(&(buffer[position])); i++) { printf("\010"); } break; default: /* * Tout caractere autre, on le rajoute a la position en cours */ if (insert) { inserer(&(buffer[position]), cread); printf("%s", &(buffer[position])); position++; for (i = 0; i < strlen(&(buffer[position])); i++) { printf("\010"); } } else { printf("%c", cread); if (buffer[position]) { buffer[position++] = cread; } else { buffer[position++] = cread; buffer[position] = 0; } } break; } } }