1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <gki.h>
define I_OPCODE Mems[$1+GKI_HDR_OPCODE-1]
define WS_MODE Mems[$1+GKI_OPENWS_M - 1]
define SZ_TEXT (5 * SZ_LINE)
# T_GKIDIR -- print a directory of frames in the named GKI metacode files.
procedure t_gkidir ()
pointer sp, mc_fname
int list, mfd
int clpopni(), open(), clgfil()
begin
call smark (sp)
call salloc (mc_fname, SZ_FNAME, TY_CHAR)
list = clpopni ("input")
while (clgfil (list, Memc[mc_fname], SZ_FNAME) != EOF) {
mfd = open (Memc[mc_fname], READ_ONLY, BINARY_FILE)
call printf ("\nMETAFILE '%s':\n")
call pargstr (Memc[mc_fname])
call gkd_read_metacode (mfd)
call close (mfd)
}
call clpcls (list)
call sfree (sp)
end
# GKD_READ_METACODE -- reads through a metacode file, printing a directory of
# the size and title of each frame in the file.
procedure gkd_read_metacode (mf)
int mf # Metacode file descriptor
bool new_frame
char tx_string[SZ_TEXT+1]
pointer gki
int nframe, length, mc_length, seek_text
int nchars, nchars_max, op_code
int gki_fetch_next_instruction()
errchk gki_fetch_next_instruction
begin
nframe = 0
mc_length = 0
new_frame = false
repeat {
length = gki_fetch_next_instruction (mf, gki)
if (length == EOF)
break
op_code = I_OPCODE (gki)
if ((op_code == GKI_OPENWS && WS_MODE(gki) == NEW_FILE) ||
(op_code == GKI_CLEAR)) {
# New frame encountered, marks end of previous frame.
if (new_frame) {
# Last instruction was also a new frame. Just bump length.
mc_length = mc_length + length
next
} else
new_frame = true
if (nframe > 0)
call gkd_print_directory (nframe, mc_length, tx_string)
nframe = nframe + 1
mc_length = length
nchars_max = 0
call strcpy ("(no title)", tx_string, SZ_LINE)
seek_text = YES
} else {
new_frame = false
mc_length = mc_length + length
}
if (op_code == GKI_MFTITLE) {
# No need to look at gtext commands any more - found a title.
seek_text = NO
nchars_max = min (int(Mems[gki+GKI_MFTITLE_N-1]), SZ_TEXT)
call achtsc (Mems[gki+GKI_MFTITLE_T-1], tx_string, nchars_max)
tx_string[nchars_max+1] = EOS
}
if (op_code == GKI_TEXT && seek_text == YES) {
# If this is longest string so far, save it as title.
nchars = Mems[gki + GKI_TEXT_N - 1]
if (nchars > nchars_max) {
nchars_max = min (nchars, SZ_TEXT)
call achtsc (Mems[gki+GKI_TEXT_T-1], tx_string, nchars_max)
tx_string[nchars_max+1] = EOS
}
}
}
# Print information from last frame in index, unless last frame is
# only a clear instruction.
if (mc_length > GKI_CLEAR_LEN)
call gkd_print_directory (nframe, mc_length, tx_string)
end
# GKD_PRINT_DIRECTORY -- Print directory information of metacode frame.
procedure gkd_print_directory (nframe, size, title)
int nframe # Frame number
int size # Length of metacode file
char title[ARB] # Metacode title
begin
call printf (" [%d] (%d words) %26t%s\n")
call pargi (nframe)
call pargi (size)
call pargstr (title)
end
|