Liite 4. Autolaskuri-esimerkki Tcl/Tk sekä C-kielillä.
/*****************************************************************
** Autolaskuri, 2. versio. C-kielinen osio.
**
** Autolaskuri -esimerkki. Käyttöliittymä tehty Tcl/Tk -kielillä,
** aliohjelmat C-kielellä. Autolaskurin kuva löytyy luvusta 5 (kuva 5.3).
** C-ohjelman kääntö tapahtuu koneesta riippuen esimerkiksi
** komennolla:
** cc -o ohjelma ohjelma.c -ltk -ltcl -lX11 -lm
** Eeva-Kaisa Rouhiainen, tehty 7.7.1998
*********************************************************************************/
#include <tk.h>
#include <tcl.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int c_henkilo_autot = 0;
int c_kuorma_autot = 0;
/*************************/
/* Aliohjelmien esittelyt*/
/*************************/
int lisaa_auto( ClientData clientdata, Tcl_Interp *interp, int argc,char *argv[]);
int nollaa( ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[]);
/************************************************************/
/* Pääohjelma */
/* Pääohjelmasta kutsutaan vain Tcl_AppInit -aliohjelmaa */
/* Tk_Main -aliohjelman avulla. */
/************************************************************/
main (int argc, char *argv[] )
{
Tk_Main(argc, argv, Tcl_AppInit);
exit(0);
}
/************************************************************/
/* Aliohjelma Tcl_AppInit */
/* Aliohjelmassa luodaan tulkki (interp) sekä linkitetään */
/* muuttujat Tcl:n ja C-koodin välille. Aliohjelmasta */
/* kutsutaan myös Tcl-koodia. */
/************************************************************/
int Tcl_AppInit(Tcl_Interp *interp)
{
int code;
if ( Tcl_Init(interp) == TCL_ERROR ) { return TCL_ERROR; }
if ( Tk_Init(interp) == TCL_ERROR ) { return TCL_ERROR; }
/* Tcl_CreateCommand -komennon avulla esitellään aliohjelmat lisaa_auto ja nollaa Tcl-kieliselle koodille */
Tcl_CreateCommand (interp, "lisaa_auto", lisaa_auto, (ClientData) Tk_MainWindow(interp),(Tcl_CmdDeleteProc*) NULL);
Tcl_CreateCommand (interp, "nollaa", nollaa,(ClientData) Tk_MainWindow(interp),(Tcl_CmdDeleteProc*) NULL);
/* Tcl_LinkVar-komennon avulla sidotaan Tcl-kieliset ja C-kieliset muuttujat toisiinsa. */
Tcl_LinkVar(interp, "tcl_henkilo_autot", (char *) &c_henkilo_autot, TCL_LINK_INT);
Tcl_LinkVar(interp, "tcl_kuorma_autot", (char *) &c_kuorma_autot, TCL_LINK_INT);
/*Tcl_EvalFile -komennon avulla suoritetaan Tcl-koodi */
code = Tcl_EvalFile(interp, "koodi.tcl");
if(*interp->result != 0) {printf("virhetilanne: %s\n", interp->result); }
if (code != TCL_OK) { printf("virhetilanne TCL_ERROR !\n"); exit(1); }
Tk_MainLoop();
return TCL_OK;
}
/************************************************************/
/* Aliohjelma lisaa_auto */
/* Aliohjelmassa lisätään joko kuorma-autojen tai henkilö- */
/* autojen lukumäärää yhdellä. */
/************************************************************/
int lisaa_auto( ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
{
if (argc != 2) {
interp->result = "wrong # args";
return TCL_ERROR;
}
if (strcmp(argv[1], "henkiloauto") == 0) { c_henkilo_autot++;}
if (strcmp(argv[1], "kuormaauto") == 0) { c_kuorma_autot++; }
return TCL_OK;
}
/************************************************************/
/* Aliohjelma nollaa */
/* Aliohjelmassa nollataan autojen lukumäärät. */
/************************************************************/
int nollaa( ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
{
if (argc != 1) {
interp->result = "wrong # args";
return TCL_ERROR;
}
c_henkilo_autot = 0;
c_kuorma_autot = 0;
return TCL_OK;
}
#####################################################
# Autolaskuri, 2. versio. Tcl/Tk -kielinen osio.
#
# Eeva-Kaisa Rouhiainen, tehty 7.7.1998
#####################################################
set henkilo_autot 0
set kuorma_autot 0
# wm -ikkunan käsittely
wm title . "Autolaskuri"
# Frame
frame .laskurit
frame .laskurit.kuorma
frame .laskurit.henkilo
frame .menubar -relief raised -bd 2
# Label
label .otsikko -text "AUTOLASKURI" -bg white
label .laskurit.henkilo.henkiloentry -width 5 -relief sunken -bd 1 -textvariable henkilo_autot
label .laskurit.kuorma.kuormaentry -width 5 -relief sunken -bd 1 -textvariable kuorma_autot
# Menu
menubutton .menubar.file -text "File" -underline 0 -menu .menubar.file.menu
menu .menubar.file.menu
.menubar.file.menu add command -label "Exit" -underline 0 -accelerator "Alt+e" -command exit
# Button
button .laskurit.henkilo.henkilobutton -text "Henkilöautoja" -command {
lisaa_auto henkiloauto
set henkilo $tcl_henkilo_autot
}
button .laskurit.kuorma.kuormabutton -text "Kuorma-autoja" -command {
lisaa_auto kuormaauto
set kuorma_autot $tcl_kuorma_autot
}
button .nollaa -text "Nollaa" -command {
nollaa
set henkilo_autot $tcl_henkilo_autot
set kuorma_autot $tcl_kuorma_autot
}
# Pack
pack .menubar -side top -fill x
pack .menubar.file -side left
pack .laskurit.henkilo.henkilobutton .laskurit.henkilo.henkiloentry -side top -fill x
pack .laskurit.kuorma.kuormabutton .laskurit.kuorma.kuormaentry -side top -fill x
pack .laskurit.henkilo .laskurit.kuorma -side left
pack .laskurit.henkilo -padx 1m
pack .laskurit.kuorma -padx 1m
pack .otsikko .laskurit .nollaa -side top
pack .nollaa -pady 2m
pack .otsikko -fill x -ipady 3m
# Bind
bind all <Alt-e> {exit}
bind all <KeyPress-h> {
lisaa_auto henkiloauto
set henkilo_autot $tcl_henkilo_autot
}
bind all <KeyPress-k> {
lisaa_auto kuormaauto
set kuorma_autot $tcl_kuorma_autot
}
bind all <KeyPress-n> {
nollaa
set henkilo_autot $tcl_henkilo_autot
set kuorma_autot $tcl_kuorma_autot
}