Volker Englisch
2014-06-16 16:40:34 UTC
Hallo,
ich versuche gerade, ein ursprünglich in Pascal geschriebenes
Progrämmchen nach C umzusetzen (da der Pascal-Compiler nur statisch
linken kann und riesige Binaries ausspuckt).
Das Teil macht nichts anderes, als aus einem File oder von stdin zu
lesen und die Ausgabe nach /dev/tty zu senden. Davor und danach wird
das Terminal umgeschaltet, sodaß der Ausdruck an den angeschlossenen
Drucker geht. Dazwischen erfolgt noch eine Umsetzung einiger
Sonderzeichen. Funktioniert auch so weit. Nun hätte ich gerne bei einem
Abbruch mit Ctrl-C noch die Sequenz zum Zurückschalten gesendet. Unten
die (verkürzte) Version, die zumindest kompiliert, wenn auch mit der
Fehlermeldung "tprint.c: In function 'main': tprint.c:79: warning:
passing argument 2 of 'signal' makes pointer from integer without a
cast".
Inzwischen habe ich einiges dazu im Netz gefunden, nämlich das Handling
in eine Funktion auszulagern. Aber egal, ob ich am Anfang einen
Prototyp einer Funktion und die Funktion selbst ans Ende schreibe, oder
gleich die Funktion an den Anfang: Der Compiler meckert mich
grundsätzlich an, daß er "terminal" nicht kennt.
Frage eines in C wenig bedarften: Wo liegt mein Denkfehler?
V*
--------------------------------------------------------------
#include <stdio.h>
#include <signal.h>
char *PASSTHRU_EIN = "\e[5i";
char *PASSTHRU_AUS = "\e[4i";
|void sighandler (void);
|{
| fprintf ( terminal, PASSTHRU_AUS );
| ...
|}
^^^^^^^^^^^^^^^
Hier bekomme ich den Fehler, daß "terminal" unbekannt ist.
int umwandlung(int ein)
{
int aus;
switch(ein)
{
case 171: aus = 174; break; /* OFw nach links */
[...]
default: aus = ein; break;
}
return ( aus );
}
/**********************************************************************/
/* HAUPTPROGRAMM */
/**********************************************************************/
int main ( int argc, char *argv[] )
{
int x;
FILE *terminal;
terminal = fopen ( "/dev/tty", "w" );
if ( terminal == NULL )
{
printf ( "Kann Terminal nicht öffnen\n" );
return 2;
}
signal(SIGINT, fprintf ( terminal, PASSTHRU_AUS ) );
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^ Gibt Hinweis beim Comilieren
fprintf ( terminal, PASSTHRU_EIN );
if ( argc >= 2 ) /* Datei wird angegeben */
{
FILE *datei;
datei = fopen ( argv[1], "r" );
if ( datei == NULL )
{
printf ( "Kann Datei nicht öffnen\n" );
return 1;
}
else
{
while ( ( x = fgetc ( datei ) ) != EOF )
{
fputc ( umwandlung(x), terminal );
}
fclose ( datei );
}
}
else /* Keine Datei angegeben, Stdin lesen */
{
while ( ( x = getchar() ) != EOF )
{
fputc ( umwandlung(x), terminal );
}
}
if ( x != 12 )
{
fputc ( 12, terminal);
}
fprintf ( terminal, PASSTHRU_AUS );
fclose (terminal );
}
ich versuche gerade, ein ursprünglich in Pascal geschriebenes
Progrämmchen nach C umzusetzen (da der Pascal-Compiler nur statisch
linken kann und riesige Binaries ausspuckt).
Das Teil macht nichts anderes, als aus einem File oder von stdin zu
lesen und die Ausgabe nach /dev/tty zu senden. Davor und danach wird
das Terminal umgeschaltet, sodaß der Ausdruck an den angeschlossenen
Drucker geht. Dazwischen erfolgt noch eine Umsetzung einiger
Sonderzeichen. Funktioniert auch so weit. Nun hätte ich gerne bei einem
Abbruch mit Ctrl-C noch die Sequenz zum Zurückschalten gesendet. Unten
die (verkürzte) Version, die zumindest kompiliert, wenn auch mit der
Fehlermeldung "tprint.c: In function 'main': tprint.c:79: warning:
passing argument 2 of 'signal' makes pointer from integer without a
cast".
Inzwischen habe ich einiges dazu im Netz gefunden, nämlich das Handling
in eine Funktion auszulagern. Aber egal, ob ich am Anfang einen
Prototyp einer Funktion und die Funktion selbst ans Ende schreibe, oder
gleich die Funktion an den Anfang: Der Compiler meckert mich
grundsätzlich an, daß er "terminal" nicht kennt.
Frage eines in C wenig bedarften: Wo liegt mein Denkfehler?
V*
--------------------------------------------------------------
#include <stdio.h>
#include <signal.h>
char *PASSTHRU_EIN = "\e[5i";
char *PASSTHRU_AUS = "\e[4i";
|void sighandler (void);
|{
| fprintf ( terminal, PASSTHRU_AUS );
| ...
|}
^^^^^^^^^^^^^^^
Hier bekomme ich den Fehler, daß "terminal" unbekannt ist.
int umwandlung(int ein)
{
int aus;
switch(ein)
{
case 171: aus = 174; break; /* OFw nach links */
[...]
default: aus = ein; break;
}
return ( aus );
}
/**********************************************************************/
/* HAUPTPROGRAMM */
/**********************************************************************/
int main ( int argc, char *argv[] )
{
int x;
FILE *terminal;
terminal = fopen ( "/dev/tty", "w" );
if ( terminal == NULL )
{
printf ( "Kann Terminal nicht öffnen\n" );
return 2;
}
signal(SIGINT, fprintf ( terminal, PASSTHRU_AUS ) );
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^ Gibt Hinweis beim Comilieren
fprintf ( terminal, PASSTHRU_EIN );
if ( argc >= 2 ) /* Datei wird angegeben */
{
FILE *datei;
datei = fopen ( argv[1], "r" );
if ( datei == NULL )
{
printf ( "Kann Datei nicht öffnen\n" );
return 1;
}
else
{
while ( ( x = fgetc ( datei ) ) != EOF )
{
fputc ( umwandlung(x), terminal );
}
fclose ( datei );
}
}
else /* Keine Datei angegeben, Stdin lesen */
{
while ( ( x = getchar() ) != EOF )
{
fputc ( umwandlung(x), terminal );
}
}
if ( x != 12 )
{
fputc ( 12, terminal);
}
fprintf ( terminal, PASSTHRU_AUS );
fclose (terminal );
}