@ all :
Voila histoire de pas rester sans rien faire pendant les vacances, je me suis demande comment faire un éditeur de texte tout bete en C. Donc interface en ncurses, jusque la rien de bien complexe, avec detection des touches et remplissage d’un buffer. Quand le buffer est plein on le sauve dans un fichier et on recommence etc. Pour ce qui est de la lecture dans le fichier, on scanne le contenu du fichier a ouvrir et on charge une partie du contenu dans le buffer. Bref, jusque la rien de sorcier. Toujours est il que j’ai commence a faire ca et je vous poste le resultat. Resultat ca marche pour le moment, mais en cours d’utilisation, la CPU a des facheuses tendances a “swinger” autour de 60% - 90%. Ca fait quand meme beaucoup pour un simple editeur de texte en console nan :p. Donc j’aimerais avoir vos suggestions quant aux ameliorations possibles surtout sur ce point. Sur d’autres aussi bien evidemment.
A oui autre remarque, savoir si quelqu’un aurait une approche differente pour la maniere d’envisager le probleme, ca c’est pour la culture et savoir si le code est comprehensible et propre, ca c’est pour la critique (Nan ca m’aiderait de savoir si je code potablement ou pas sachant que je suis en ecole d’inge et que je me destine a faire de l’embarque, domaine dans lequel on utilise tout plein de C, avec du C proche du materiel (la c’est pas le cas dans l’exemple, mais si le code est deja propre ca n’en est que mieux).
J’attends vos remarques a tous. Merci.
Fichier editor.h
* Simple text editor by Doby
*/
#ifndef EDITOR_H
#define EDITOR_H
/*
* Define buffer size and line size (width)
*/
#define length 800
#define width 80
/*
* Define values of ASCII keys
*/
#define ENTER 10
#define ESCAPE 27
/*
* InitBuffer(char buffer[length])
* All cells of the buffer contain '\0' caracter
*/
void InitBuffer(char buffer[length]);
/*
* UseBuffer(char buffer[length])
* Move the cursor in the buffer + Insert & Modify content of the buffer
*/
void UseBuffer(char buffer[length]);
/*
* Print buffer
*/
void PrintBuffer(char buffer[length]);
/*
* Quit Editor
*/
void Quit();
#endif //EDITOR_H
Fichier editor.c
[code]#include <stdio.h>
#include <stdlib.h>
#include <ncurses.h>
#include “…/Include/editor.h”
volatile int Position;
int main(void){
char buffer[length];
int index = 0;
Position = 0;
//Initialisation Graphique
initscr();
cbreak();
curs_set(0);
keypad(stdscr,TRUE);
//Initialisation buffer
InitBuffer(buffer);
PrintBuffer(buffer);
while(1){
UseBuffer(buffer);
usleep(10000);
}
//Retour programme
endwin();
system(“clear”);
exit (0);
}
/*
- All cells of the buffer contain ‘\0’ caracter
*/
void InitBuffer(char buffer[length]){
int index = 0;
for(index = 0; index < length; index++){
buffer[index] = ’ ';
}
}
/*
- Move cursor in the buffer + Insert & Modify content of the buffer
*/
void UseBuffer(char buffer[length]){
int key;
nodelay(stdscr, TRUE);
if((key = getch())== -1)
return;
else{
switch(key){
case KEY_UP:
if(Position > width)
Position -= width;
break;
case KEY_DOWN:
if(Position < length - width - 1)
Position += width;
break;
case KEY_LEFT:
if(Position > 0)
Position--;
break;
case KEY_RIGHT:
if(Position < length - 1)
Position++;
break;
case KEY_BACKSPACE:
buffer[Position] = ' ';
if(Position > 0)
Position--;
break;
case KEY_HOME:
Position -= (Position % width);
break;
case ENTER:
if(Position < length - width - 1)
Position = (Position + width - (Position % width));
break;
case ESCAPE:
Quit();
break;
default:
if(key >= 32 && key <= 126){
buffer[Position] = (char)key;
if(Position < length - 1)
Position++;
}
break;
}
//Call PrintBuffer
PrintBuffer(buffer);
}
}
/*
- Print buffer
*/
void PrintBuffer(char buffer[length]){
int line = 0, column = 0, index = 0;
system(“clear”);
//Print content of the buffer
for(index = 0; index < length; index++){
line = (index / width);
column = (index - line * width);
if(index == Position)
mvaddch(line, column, ‘§’);
else
mvaddch(line, column, buffer[index]);
refresh();
}
}
/*
- Quit Editor
*/
void Quit(){
endwin();
system(“clear”);
exit (0);
}
[/code]