Pagina 1 di 1

[C source] Editor di linea.

MessaggioInviato: 2 nov 2013, 3:20
da TardoFreak
Per i miei lavori faccio spesso uso della seriale per implementare interpreti di comandi. Questi mi servono per il monitoraggio di variabili e per potere testare i sistemi.
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. O_/

Re: [C source] Editor di linea.

MessaggioInviato: 2 nov 2013, 11:52
da Paolino
Ottimo :ok:

Ciao

Paolo

Re: [C source] Editor di linea.

MessaggioInviato: 2 nov 2013, 13:50
da c1b8
Grazie, fanno sempre comodo funzioni generiche!