summaryrefslogtreecommitdiff
path: root/ipl/packs/idol/buffer.iol
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/packs/idol/buffer.iol')
-rw-r--r--ipl/packs/idol/buffer.iol132
1 files changed, 132 insertions, 0 deletions
diff --git a/ipl/packs/idol/buffer.iol b/ipl/packs/idol/buffer.iol
new file mode 100644
index 0000000..52cb4f7
--- /dev/null
+++ b/ipl/packs/idol/buffer.iol
@@ -0,0 +1,132 @@
+class buffer(public filename,text,index)
+ # read a buffer in from a file
+ method read()
+ f := open(self.filename,"r") | fail
+ self$erase()
+ every put(self.text,!f)
+ close(f)
+ return
+ end
+ # write a buffer out to a file
+ method write()
+ f := open(self.filename,"w") | fail
+ every write(f,!self.text)
+ close(f)
+ end
+ # insert a line at the current index
+ method insert(s)
+ if self.index = 1 then {
+ push(self.text,s)
+ } else if self.index > *self.text then {
+ put(self.text,s)
+ } else {
+ self.text := self.text[1:self.index]|||[s]|||self.text[self.index:0]
+ }
+ self.index +:= 1
+ return
+ end
+ # delete a line at the current index
+ method delete()
+ if self.index > *self.text then fail
+ rv := self.text[self.index]
+ if self.index=1 then pull(self.text)
+ else if self.index = *self.text then pop(self.text)
+ else self.text := self.text[1:self.index]|||self.text[self.index+1:0]
+ return rv
+ end
+ # move the current index to an arbitrary line
+ method goto(l)
+ if (1 <= l) & (l <= *self.text+1) then return self.index := l
+ end
+ # return the current line and advance the current index
+ method forward()
+ if self.index > *self.text then fail
+ rv := self.text[self.index]
+ self.index +:= 1
+ return rv
+ end
+ # place the buffer's text into a contiguously allocated list
+ method linearize()
+ tmp := list(*self.text)
+ every i := 1 to *tmp do tmp[i] := self.text[i]
+ self.text := tmp
+ end
+ method erase()
+ self.text := [ ]
+ self.index := 1
+ end
+ method size()
+ return *(self.text)
+ end
+initially
+ if \ (self.filename) then {
+ if not self$read() then self$erase()
+ } else {
+ self.filename := "*scratch*"
+ self.erase()
+ }
+end
+
+
+class buftable : buffer()
+ method read()
+ self$buffer.read()
+ tmp := table()
+ every line := !self.text do
+ line ? { tmp[tab(many(&ucase++&lcase))] := line | fail }
+ self.text := tmp
+ return
+ end
+ method lookup(s)
+ return self.text[s]
+ end
+end
+
+
+class bibliography : buftable()
+end
+
+
+class spellChecker : buftable(parentSpellChecker)
+ method spell(s)
+ return \ (self.text[s]) | (\ (self.parentSpellChecker))$spell(s)
+ end
+end
+
+
+class dictentry(word,pos,etymology,definition)
+ method decode(s) # decode a dictionary entry into its components
+ s ? {
+ self.word := tab(upto(';'))
+ move(1)
+ self.pos := tab(upto(';'))
+ move(1)
+ self.etymology := tab(upto(';'))
+ move(1)
+ self.definition := tab(0)
+ }
+ end
+ method encode() # encode a dictionary entry into a string
+ return self.word||";"||self.pos||";"||self.etymology||";"||self.definition
+ end
+initially
+ if /self.pos then {
+ # constructor was called with a single string argument
+ self$decode(self.word)
+ }
+end
+
+class dictionary : buftable()
+ method read()
+ self$buffer.read()
+ tmp := table()
+ every line := !self.text do
+ line ? { tmp[tab(many(&ucase++&lcase))] := dictentry(line) | fail }
+ self.text := tmp
+ end
+ method write()
+ f := open(b.filename,"w") | fail
+ every write(f,(!self.text)$encode())
+ close(f)
+ end
+end