Dopo aver scritto innumerevoli volte un editor di linea ne ho scritto uno che si adatta praticamente a tutti i compilatori che uso.
Spero quindi di fare cosa gradita nel postare il sorgente di questo semplice editor che oramai fa parte della mia libreria personale di uso generale.
- Codice: Seleziona tutto
//------------------------------------------------------------------------------
// Editor di linea.
// Funzione per l' editing di linea mediante STDIO.
// La stringa d' ingresso viene visualizzata sul terminale e si può editare
// utilizzando solo il tasto BS o DEL che hanno la stessa funzione.
// L' editing finisce con la pressione del CR oppure premendo ESC.
// La funzione ritorna il codice del tasto con cui si è usciti dall' editing
//
// Parametri:
// s: stringa da editare
// lMax: lunghezza massima della stringa
//
// Uscita: carattere di uscita.
//
// Dipendenze:
// char getchar(void) per la lettura del carattere da terminale
// void putchar(char c) per la scrittura di un carattere su terminale
//
// Note: I caratteri sono scritti con il codice ASCII per fare in modo che questa
// funzione non dipenda da defines.
// Per l' ingresso del carattere è stata utilizzata la funzione getchar e per
// la stampa del carattere la funzione putchat. E' opportuno definire queste
// funzioni se non supportate dal compilatore.
static char lineEdit(char *s, unsigned short lMax)
{
unsigned short posStr; // Lunghezza inziale della stringa
char ch, fine = 0;
char *p;
// Calcola la lunghezza attuale della stringa e la posizione del cursore
posStr = strlen(s);
// Scrive la stringa da editare
p = s; while(*p) putchar(*p++);
// Ciclo di editing
do
{
if (ch = getchar())
{
switch(ch)
{
// Caratteri di editing
case 0x08: // Carattere BS
case 0x7f: // Carattere DEL
if (posStr)
{
*(s + posStr--) = 0;
putchar(0x08);
putchar(' ');
putchar(0x08);
}
break;
// Caratteri che determinano la fine dell' editing
case 0x0D: // Carattere CR
case 0x1B: // Carattere ESC
// inserisce il terminatore
fine = !(*(s + posStr) = 0);
break;
// Inserimento dei caratteri
default:
if ((posStr < (lMax-1)) && (ch >= ' ' ) && (ch <= 126))
putchar(*(s + posStr++) = ch);
break;
}
}
} while(!fine);
// toglie gli spazi al fondo
for(posStr = lMax - 1; posStr >= 0; posStr--)
if ((*(s+posStr) == ' ') || (!*(s+posStr))) *(s+posStr) = 0; else break;
// Ritorna il carattere di uscita
return ch;
}
Buona sperimentazione.


Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


