Newsgroup: it.comp.lang.c
Titolo: Shell Unix

Come progetto per il corso di laboratorio di sistemi Operativi 1 devo
rielaborare una rudimentale shell di unix (che dovra' girare su delle
spark 20 sotto Solaris) in modo da implemantere varie funzioni
(ridirezioni, pipe, ecc) e ho bisogno di alcuni consigli, spero che
possiate aiutarmi.
Il problema che devo affrontare adesso riguarda l'elaborazione della
stringa da passare al prompt.
Devo poter cancellare un carattere, muovere il cursore lungo la
stringa (senza passare oltre), modificare la stringa inserendo
caratteri dalla posizione del cursore, history dei comandi. Tutte
queste cose non sono obbligatorie, ma ritengo che rendano la mia shell
molto piu' funzionale.
Nota: uso un buffer di 512 caratteri.
Il primo problema riscontrato e' che non conosco la codifica ASCII
delle frecce direzionali e del tasto "canc". Esiste in c qualcosa,
come "\n" per il tasto INVIO,  per rappresentare le frecce direzionali
e il canc (sono sicuro che esiste per il backspace e dovrebbe essere
\b, o sbaglio)?
Adesso mi si pone un secondo problema: che funzione utilizzo per
ricevere la stringa da stdin?
Non credo di poter utilizzare le funzioni standart per l'acquisizione
di stringhe perché devo controllare i singoli caratteri immessi,
perché ad alcuni di essi corrispondono azioni speciali.
Pensavo di utilizzare la getch() , credo che il nome sia corretto (è
una funzione delle ncurses) che legge un singolo carattere, senza
bufferizzazione e interpretare il songolo carattere, ma adesso non so
bene come rappresentare la situazione a video.
Io pensavo dopo ogni modifica di ristampare la stringa dalla posizione
del cursore in poi, avete altre idee?
Spero che mi possiate suggerire

 del cursore in poi, avete altre idee?
Perchè? Ciò serve solo se per qualche motivo ti trovi a dover stampare a
video qualcosa in più di quello che sta scrivendo l'utente (una sorta di
"auto-composizione" o di "suggerimento"?). In tal caso, ti consiglierei di
prendere esempio dal mondo Windows e stampare il "suggerimento" su una linea
diversa, se puoi, altrimenti rischi di confondere l'utente, che non sa più
dove sta scrivendo.
Senza contare che credo siano disponibili in rete i sorgenti delle shell
Unix, da cui puoi abbondantemente attingere per capire come funzionano.
Ciao
--
Alessandro Monti

bene come rappresentare la situazione a video.
Se hai una funzione di posizionamento sullo schermo puoi agire a
livello di carattere (scrivere e cancellare un solo carattere alla
volta).
Comunque a me sembra che tu stia complicando le cose.
Non conosco il progetto nei dettagli, ma mi sembra che una funzione
standard potrebbe bastare.
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

 Non so, comunque, se funzioni sotto Unix.
  Penso di no. Sarebbe preferibile utilizzare le Curses.
	Alla prossima,
		Marco

 wrote:
[ snip ]
M>Devo poter cancellare un carattere, muovere il cursore lungo la
M>stringa (senza passare oltre), modificare la stringa inserendo
M>caratteri dalla posizione del cursore, history dei comandi.
Se ne hai la possibilita', dai un'occhiata alla libreria GNU
Readline.
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

Posto il codice della funzione interessata direttamente. Il pezzo di
codice evidenziato dalle slash e' quello incriminato. In questo modo
leggo qualsiasi carattere, ma le frecce direzionali e il canc vengono
interpretati male.
La mia idea era di aggiungere degli if per supportare le frecce
direzionali e il canc (se proprio non riesco a fare di meglio, almeno
voglio evitare che mi stampi a video le sequenze di escape).
La variabile p contiene semplicemente il prompt da stampare.
Suggeritemi come posso migliorare la gestione, please.
P.S. In seguito posterò altre parti della shell, ma se siste
interessati la posso inviare in toto (per adesso la versione
rudimentale), ma occupa 81k compresso.
Paolo 
int userin(char *p)		/* stampa il prompt e legge una riga
*/
{
  int c, count;
  /* inizializzazioni per altre routines */
  ptr = inpbuf;
  tok = tokbuf;
  /* stampa il prompt */
  printf("%s ",p);
  for(count=0;;) {
    if ((c = getchar()) == EOF)
      return(EOF);
    /* se si raggiunge e supera MAXBUF, non si scrive piu' in
       inpbuf, ma si continua a leggere fino a newline (si veda sotto)
*/
    if (count < MAXBUF)
      inpbuf[count++] = c;
    if (c == '\n' && count < MAXBUF) {
      inpbuf[count] = '\0';
      return(count);
    }
    /*  avendo superato MAXBUF, quando si arriva al newline
	si da' il messaggio e si riparte con un nuovo comando */
    if (c == '\n') {	/* implicito: && count >= MAXBUF */
      printf("riga in input troppo lunga\n");
      count = 0;
      printf("%s ",p);
    }
  }
}

Readline.
Sai dirmi dove posso trovarla?
Paolo

 }
Io volevo fare una domanda.
Visto che si progetta una shell per Unix non č meglio usare direttamente le
primitive di Unix invece delle printf, ecc....  delle librerie standard ?
Le primitive di accesso ai file sono sempre le stesse per tutti i sistemi
Unix, vero ?

 FINE
readline-2.0.tar.gz
readline-2.1.tar.gz
readline-2.2-2.2.1.diff
readline-2.2.1-4.0.diff.gz
readline-2.2.1.tar.gz
readline-2.2.tar.gz
readline-4.0.tar.gz
[bigfok@fokhouse bigfok]$
