#!/usr/bin/expect
#
# Callbook-DOS-Applikation starten, bergebene Adresse suchen
# und diese dann ber die Print-Funktion in eine Datei 
# ausdrucken. Dieses Programm dient zum Einsatz als Callbook-Interface
# fr CLX.
#
# DL6RAI 23.1.1998
#
# Fehler behoben mit berlangen Zeilen (DK4VW), Sun May  3 17:48:39 GMT 1998
# Anpassung an 1999er-Version, Thu Nov 26 21:42:14 GMT 1998

# Debug-Variable:
# -> zum Debuggen
# exp_internal -f cba.log 0

log_user 0
set filename "/tmp/lookup.[pid]"
set debug 0
set env(TERM) xterm
set timeout 15
set logbook "~/log/cba.log"
set config "~/config/clx_par"
set now [ timestamp -format %c ]
set send_human {.1 .3 1 .05 2}

# Laufwerksbuchstaben bestimmen

if [ file readable $config ] {

	set input [open "$config" "r" ]
	set drive ""

	while {[gets $input line] != -1 } {

		# Komentare und Forsetzungszeilen ignorieren

		if {[regexp "^\[^#\].*:" $line] == 0} { 
			continue 
		}

		scan $line "%s%s" cmd arg

		if {[string match "cba_drive:" $cmd]} {

			set drive [string toupper "$arg"]
			if {$debug > 1} {
				puts "Drive: >>$drive<<"
			}
		}
	}

	close $input
}

if {[string match $drive ""]} {
	puts "Missing cba_drive: entry in $config - aborting..."
	exit
}

# Die beiden Parameter holen:
# 1. Mycall
# 2. Gesuchte Calls mit Leerzeichen getrennt als einzelner String

if {$debug > 1} { puts "Length: >>[llength $argv]<<" }
if {[llength $argv] < 2} {
	puts "Please specify a callsign."
	exit
} 

set mycall [string toupper [lindex $argv 0] ]
set mycall [string trim $mycall]

# set slist [string toupper [lrange $argv 1 [llength $argv] ] ]
set slist [string toupper [lrange $argv 1 $argc] ]
if {$debug > 1} {puts "1. Slist: >>$slist<<"}
set slist [string trim $slist]
if {$debug > 1} {puts "2. Slist: >>$slist<<"}
set slist [split $slist " "]
if {$debug > 1} {puts "3. Slist: >>$slist<<"}

if {$debug > 1} {puts "4. Slist: >>$slist<<"}

while {[lsearch $slist ""] != -1} {
	set i [lsearch $slist ""]
	set slist [lreplace $slist $i $i]
}

# Zugriffe werden mitgeloggt
set log [open $logbook "a"]
puts $log "$now $mycall: sh/cba $slist"
close $log

if {$debug > 1} {puts "5. 3list: >>$slist<<"}

if {[string length $slist] == 0} {
	puts "Please specify one or more callsigns."
	exit
} 

spawn /usr/bin/dos -I "printer { file \"$filename\" }"

# Warte auf Laufwerk C:-Prompt

expect { 
	"C:*>" {
		send "$drive\r"
	}
	"Sorry" {
		puts "failed to start DOSEMU - check /etc/dosemu.users"
		exit
	}
	timeout {
		puts "did not find C: prompt."
		exit
	}
}

# Auf CDROM-Verzeichnis stellen und nach CALLBOOK wechseln

# exp_internal 1
expect { 
	"*>" { 
		send -h "calldos\r"
	}
	timeout { 
		puts "Could not change to drive $drive."
		exit
	}
}

expect *

# Options -> Label Groesse auf 8 Zeilen einstellen


expect {
	-re ".*10;1\[38\]H" { 
		send "\033o"
		expect "*abels"
		send "l"
		expect "*ancel"
		send "\033l8\033a65\r"
	} timeout  {
		puts "Could not start calldos.exe"
		exit
	}
}

# Suche starten

foreach search $slist {
	
	if {$debug > 1} {
		puts "searching for >>$search<<." 
	}

	expect {
		-re ".*10;1\[38\]H" { 
			send -h "$search\r"
		}
		timeout  {
			puts "Could not find input mask"
			exit
		}
	}
	
	# Je nach Erfolg entweder Label ausdrucken und beenden oder die
	# Warnung "next greater entry" oder "not found"  besttigen und 
	# dann weiter.
	
	# exp_internal 1
	expect {
		-re ".*10;1\[38\]H" {
			send "\020"
			expect "*1;79H"
		}
		"*next greater entry" {
			send "\r"
			puts "$search: not found in Callbook."
			expect "*1;79H"
		}
		"*not found." {
			send "\r"
			puts "$search: not found in Callbook."
			expect "*1;79H"
		}
		timeout  {
			puts "Strange program message.."
			exit
		}
	}
}

# Programm beenden

send "\033x"

# Laufwerksprompt abwarten und dann Emulator beenden

expect {
	"$drive*>" {
		send "exitemu\r"
		expect eof
	}
	timeout  {
		puts "Could not exit dosemu."
		exit
	}
}

# Datei ausgeben, wenn eine vorhanden ist - und dann lschen

if [ file readable $filename ] {
	set input [open "$filename" "r" ]

	set result [read $input 1000]



	regsub -all "\r" $result "" result
	regsub -all "\n\n+" $result "\n\n" result
	puts -nonewline $result

	close $input
	system /bin/rm $filename
} 
