home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
ipl
/
progs
/
extweave.icn
< prev
next >
Wrap
Text File
|
2000-07-29
|
4KB
|
146 lines
############################################################################
#
# File: extweave.icn
#
# Subject: Program to extract weaving specifications from weave file
#
# Author: Ralph E. Griswold
#
# Date: September 17, 1998
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# This program extracts the weaving specifications from a Macintosh
# Painter 5 weave file in MacBinary format. (It might work on Painter 4
# weave files; this has not been tested.)
#
# The file is read from standard input.
#
# The output consists of seven lines for each weaving specification in the
# file:
#
# wave name
# warp expression
# warp color expression
# weft expression
# weft color expression
# tie-up
# blank separator
#
# The tie-up is a 64-character string of 1s and 0s in column order. That
# is, the first 8 character represent the first column of the tie-up. A
# 1 indicates selection, 0, non-selection.
#
# This program does not produce the colors for the letters in color
# expressions. We know where they are located but haven't yet figured
# out how to match letters to colors.
#
# See Advanced Weaving, a PDF file on the Painter 5 CD-ROM.
#
############################################################################
$define Offset 401 # offset to the first expression
procedure main(args)
local hex, tieup, i, binary, expr, name, namechars, tartans_list
namechars := &letters ++ &digits ++ ' -&'
tartans_list := []
binary := ""
while binary ||:= reads(, 10000) # read the whole file
# Get names.
binary ? {
tab(find("FSWI") + 4) # find names
while tab(upto(namechars)) do { # not robust
name := tab(many(namechars))
if (*name > 3) | (name == "Op") then # "heuristic"
put(tartans_list, name)
tab(upto(namechars)) | break
tab(many(namechars))
}
}
binary ? {
move(400) | stop("delta move error")
hex := move(4400) | stop("short file")
write(get(tartans_list)) | stop("short name list")
hex ? { # get the four expressions
every i := (0 to 3) do {
tab(i * 2 ^ 10 + 1)
expr := tab(upto('\x00')) | stop("no null character")
if *expr = 0 then stop("no expression") # no expression
write(expr)
}
tieup := ""
tab(4101) # now the tie-up
every 1 to 8 do {
tieup ||:= map(move(8), "\x0\x1", "01")
move(24)
}
write(decol(tieup))
write()
}
}
binary ? {
while tab(find(".KWROYL")) do {
move(4908) | stop("delta move error")
hex := move(4400) | break
write(get(tartans_list)) | stop("short name list")
hex ? { # get the four expressions
every i := (0 to 3) do {
tab(i * 2 ^ 10 + 1)
expr := tab(upto('\x00')) | stop("no null character")
if *expr = 0 then break break # no expression
write(expr)
}
tieup := ""
tab(4101) # now the tie-up
every 1 to 8 do {
tieup ||:= map(move(8), "\x0\x1", "01")
move(24)
}
write(decol(tieup))
write()
}
}
}
if *tartans_list > 0 then {
write("Unresolved tartans:")
write()
while write(get(tartans_list))
}
end
procedure decol(s)
local parts, j, form
parts := list(8, "")
s ? {
repeat {
every j := 1 to 8 do {
(parts[j] ||:= move(1)) | break break
}
}
}
form := ""
every form ||:= !parts
return form
end