Newsgroup: it.comp.os.linux.development
Titolo: Input di caratteri senza echo

Salve a tutti! chi conosce una syscall o (meglio) una sequenza di escape
per fare l'input di un singolo carattere, senza echo a video, e senza
dare il newline per terminare la lettura? Lasciando da parte le
ncurses,possibilmente,sono troppo per quello che mi serve...
Grazie a tutti

 dare il newline per terminare la lettura?
#include <stdio.h>
#include <termios.h>
int main() {
	struct termios termios;
        int c;
 
	tcgetattr(0, &termios);
	/* Clear ICANON */
	termios.c_lflag ^= ICANON;
	tcsetattr(0, TCSANOW, &termios);
	c = getchar();
	printf("-> %c\n", r);
        /* Set ICANON */
	termios.c_lflag |= ICANON;
	tcsetattr(0, TCSANOW, &termios);
	return 0;
}
Occhio  che   cosi`  leggi   direttamente  in   modalita`  raw. Sequenze
escape, tasti  funzione, ecc.  vengono letti individualmente  (ad es. F1
corrisponde  a due  caratteri,  CTRL+C viene  letto  come due  caratteri
separati, non interrompe il programma).
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Se non sei parte della soluzione, allora sei parte del problema.

        tcsetattr(0, TCSANOW, &termios);
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"In linea di principio sarei indifferente al natale, se solo il natale
 ricambiasse la cortesia e mi lasciasse in pace." -- Marco d'Itri

Grazie a tutti

 tcsetattr(0, TCSANOW, &termios);
[cut]
Non basta una getch normale?
        Alessandro

        Alessandro
non basta perchè:
- devi premere invio per fargliela leggere
- hai a schermo quello che hai scritto
cioè leggeresti comunque un carattere, ma nn sarebbe quello che aveva
chiesto yes

 Non basta una getch normale?
Si`,  ma  l'OP aveva  specificato: "Lasciando  da  parte le  ncurses". E
getch() fa proprio parte delle ncurses.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"La teoria e` quando sappiamo come funzionano le cose ma non funzionano.
 La pratica e` quando le cose funzionano ma non sappiamo perche`.
 Abbiamo unito la teoria e la pratica: le cose non funzionano piu` e non
 sappiamo il perche`." -- A. Einstein

 - hai a schermo quello che hai scritto
Da quel che ne so io la getch non richiede la pressione del tasto invio....o
almeno in tutte le implementazioni che ho visto io era cosě!
        Alessandro

 ncurses". E getch() fa proprio parte delle ncurses.
Probabilmente, avendo finora programmato quasi esclusivamente su Win dirò
qualcosa di sbagliato.... ma la getch non è definita dallo standard ANSI e
presente in "conio.h"? Oppure in linux è diverso?
        Alessandro



conio.h non esiste ( nello standard :p )
ciao
 sbirish

 conio.h non esiste ( nello standard :p )
Lo sapevo che non dovevo prestare il mio buon vecchio manuale di C! Comunque
mi sembra meno complicato l'uso di un #include "ncurses.h" (conio.h non
esiste allora in linux... me ne ricorderò) e della getch anzichè di quella
sfilza di istruzioni? Giusto per sapere per quando dovrò scrivere qualcosa
per console linux.
        Alessandro

 sfilza di istruzioni? 
Il  problema   e`  che  devi   linkare  anche  le   ncurses  (-lncurses)
costringendo gli  utilizzatori del programma ad  installare una libreria
che non e` indispensabile.
Inoltre  non  puoi usare  direttamente  getch(),  devi prima  cedere  il
controllo del  terminale alle  ncurses con  initscr() e  devi utilizzare
solo le funzioni di I/O delle ncurses. Questo per evitare che lo schermo
venga  modificato al  di fuori  del controllo  della libreria,  provando
inconsistenze.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Se il  destino di un uomo  e` annegare, anneghera` anche  in un bicchier
d'acqua.
Proverbio yddish

        Alessandro
doh, avevo letto solo getc  :)

 Kronos
 
E inoltre se linki staticamente ti viene fuori un bell'exe di 2
megabyte...un po'troppo!

 megabyte...un po'troppo!
magari mettendo un -O2 e un -s tra le opzioni di compilazione...
-- 
#include <stdio.h>/* (C) BW2K+3 This code is released under GPL 2+ */
int main(){char c[]={98,108,97,99,107,119,111,108,102,64,100,101,115,112,
97,109,109,101,100,46,99,111,109,32,119,101,98,46,116,105,115,99,97,108,
105,46,105,116,47,98,108,97,107,119,111,108,102,0};printf("%s\n",c);}

 libreria,  provando inconsistenze.
Quindi in linux non puoi scrivere:
void main(void)
{
  char ch;
  ch=getch();
  printf("Hai premuto il tasto 0x%x",ch);
}
?
Io pensavo fosse "quasi" standard.... anche perchè se non ricordo male anche
nel BIOS ci sarebbe la chiamata di sistema che fa quello.... vabbè mi
segnerò l'altro codice allora :)
            Alessandro

 anche nel BIOS ci sarebbe la chiamata di sistema che fa quello.... 
Il C standard non sa nulla di BIOS o di terminali. Conosce solo lo stdin
e lo stdout (e lo stderr). Il C standard e` caratterizzato dalla massima
portabilita`...  il  sistema  su  cui il  programma  girera`  potrebbere
ricevere l'input da un lettore di  schede ottiche e avere come output un
stampante. stdin non e` la tastiera, stdout non e` il monitor.
Per inciso le ncurses fanno internamente esattamente quello che ho fatto
io, mica ricorrono ad un int in modalita` reale ;)
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Windows NT crashed.
I'm the Blue Screen of Death.
No one hears your screams.

 magari mettendo un -O2 e un -s tra le opzioni di compilazione...
 
1,7 :-)

 1,7 :-)
hai grossi problemi...


 megabyte...un po'troppo!
Scusate... linkare staticamente vuol dire "portarsi" nell'eseguibile
l'intera libreria?
non e' possibile usare solo una funzione della libreria e portarsi
dietro solo quella? e' difficile riuscire a "portare fuori" solo una
determinata funzione? e' legale farlo? (sempre in ambito GPL)
E se invece io disassemblassi un prodotto non open source ne' gpl e
all'interno del mio programma usassi __asm__ con l'intera routine
praticamente rubata? :)
Sarebbe illegale? E se l'avessi realmente progettata io in modo
identico? Non puo' succedere? Allora vado subito a registrare il
copyright del programma "Hello World!"! ^_-
E se, mettiamo, nella mia licenza scrivessi che non e' possibile
(legalmente, ovvio) disassemblare il mio prodotto?
Cosi' facendo, potrei usare parti di librerie non gpl, in un mio
progetto che avrebbe una licenza moolto limitata che non permette a
nessuno (almeno legalmente =) ) di vedere il codice disassemblato. :)
Lo so, e' una cretinata. ^_^
Ma in un eventuale processo, quando porterebbero a sostegno le prove
(ovvero il mio codice disassemblato :) ), sarebbero nella piena
illegalita'. ^_^
Pero' potrebbero sempre dire: "sospettiamo che questo software usi
nostre librerie! vogliamo che qualcuno indaghi!"
Ma allora _chi_ potrebbe indagare? E per quale motivo dovrei mostrare i
sorgenti a qualcuno che non sia... me o il mio team!? ^_-
In fondo, il reato non c'e'. C'e' solo una societa' che ha dei
*sospetti* e chiede che s'indaghi. Costo e tempo chi li perderebbe poi?
Il giudice? Allora io domani sospettero' che la Microsoft abbia fatto lo
stesso con una mia libreria (inesistente adesso :) )! ^_-
Guardo troppi film? :)
TIA,
Noitu Lover
-- 
fine, thanks!

l'intera libreria?
<snip>
Si, e nn puoi fare diversamente (credo).
Infatti progetti come FLTK tendono a creare mini librerie che possano
esser linkate staticamente senza ingigantire il compilato.
<snip di un discorso tropo esteso>
Non so cosa dirti, ma imho, in generale: si sei colpevole.
purtroppo questo è un punto largamente dibattuto, c'è tutta una
bibliografia al riguardo, in pratica il reverse engineering viene
visto di cattivo occhio dai tribunali 
(vedi DeCSS e skliarov).
Certo, si può dire che in qualsiasi altra disciplina tecnica il RE è
una pratica del tutto naturale, ma  devi trovare un giudice
comprensivo ;)

 (legalmente, ovvio) disassemblare il mio prodotto?
Puoi anche scriverci che chi usa il tuo software è obbligato a farti da 
porta-asciugamani umano per il resto dei tuoi giorni e che deve darti 
anche il diritto di "prima nocte" con la primogenita. La validità di 
clausole del genere è perlomeno dubbia. :-)
-- 
  |   \    \  | ___|_  |_  | ianezz a casa sua... :-)
  |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
_|_/  _\_|  _|____|___|___| 
http://www.linuxtrent.it

 naturale, ma  devi trovare un giudice comprensivo ;)
se fossi messo alle corde, comincerei a portare la filosofia a sostegno
del R.E.! :) e il giudice, per farmi smettere di dire cretinate senza
senso, mi darebbe *ampiamente* ragione! ;)
Grazie e buona serata,
Noitu Lover

 validità di clausole del genere è perlomeno dubbia. :-)
rotfl! :D
Ma la Microsoft non ha messo qualcosa del genere proprio nella licenza
di WinXp? Era questo il "precedente" su cui mi sostenevo. :)
Comunque sia, grazie mille delle risposte!
Buona serata,
Noitu Lover

 sul DeCSS mi pare che alla fine il ragazzo l'abbia avuta vinta, no?
Non ancora, ha passato solo il primo grado di giudizio. Gli accusatori 
han fatto ricorso.


 di WinXp? Era questo il "precedente" su cui mi sostenevo. :)
Per quel che leggo, negli USA la base delle licenze *d'uso* si fonda sul 
fatto che la copia č regolamentata, e che per eseguire il programma 
devi... copiarlo dal supporto di memoria di massa in memoria centrale. 
Questo era stato stabilito in un caso di qualche decennio fa, e dovrebbe 
essere su questo precedente (nel sistema giudiziario statunitense i 
precedenti contano moltissimo, per quel poco che ne so) che si basa il 
tutto. In Italia non so.
C'č da dire che queste IMHO "solidissime" basi sono anche il motivo per 
cui aziende anti-GPL come La Nota Azienda esitano a portare la GPL sui 
banchi del tribunale, visto che se risultasse non valida, risulterebbe 
pure che non valgono le licenze d'uso come son proposte adesso...
Beninteso, la GPL ha un fondamento ben piů saldo, essendo una licenza 
che ti consente automaticamente la *redistribuzione* se accetti 
determinate condizioni (redistribuzione che normalmente non puoi fare in 
virtů della legge sul copyright), e non una "licenza d'uso" (non 
redistribuisci? Facci quello che ti pare).


 __declspec(dllexport) and __declspec(dllimport)
That's a complicated question.  Essentially, the MS engineers were on crack
when they designed Windows DLLs.    (C. Thompson on the Cygwin mailing list)

 Non sarei così categorico.  La GPL è una licenza d'uso
La GPL *non è* una licenza d'uso, salvo che tu consideri uso pure la 
distribuzione.
Guarda, è semplice: la legge sul copyright ti vieta di redistribuire 
tutto quanto è soggetto a copyright, eccetto quello per cui hai il 
permesso da chi detiene i diritti (ed eccetto gli altri casi di legge).
Se vuoi il permesso per distribuire, lo devi ottienere dai legittimi 
detentori dei diritti d'autore
I "legittimi dententori dei diritti d'autore" che usan la GPL sono 
disposti a concederti *automaticamente* tali diritti a determinate 
condizioni (quelle elencate nella GPL). E per cautela, c'è chi se lo fa 
dare anche esplicitamente in forma scritta secondo i termini della GPL, 
si sa mai.
Se invece non ti interessa redistribuire, la GPL non centra un tubo e, 
IMHO, non può nemmeno importi obblighi di sorta nemmeno se si volesse 
(personalmente sostengo che l'intera faccenda delle licenze *d'uso* e` 
perlomeno dubbia).
Cmq, vuoi esempio? Lo Stanford Checker (
http://metacomp.stanford.edu/
), 
e`, a detta degli autori, un GCC modificato per effettuare analisi sul 
codice e verificare che certe invarianti (definite in un file di regole 
a parte) reggano in tutti i possibili percorsi all'interno del codice.
È almeno un paio d'anni che gli autori delle modifiche effettuano 
analisi sui sorgenti del kernel di Linux e le postano abbastanza 
regolarmente sulla mailing list del kernel (e grazie a quelle analisi 
son stati trovati parecchi errori in casi limite), ma lo Stanford 
Checker non è pubblicamente disponibile a nessuno (tant'e` vero che c'e` 
chi ha messo in cantiere un concorrente,  stavolta pubblicamente 
disponibile, che e` Smatch a 
http://smatch.sourceforge.net/
), e per 
quanto possa essere un comportamento che non va incontro a una cultura 
della condivisione dei sorgenti, anche RMS se ne sta zitto zitto.


 Guarda, č semplice: 
Piů semplice di cosě! :-)
