Small Basic Sample: Line Editor
This sample is for File.InsertLine, File.ReadLine, and File.WriteLine.
Usage
Enter the text file name to edit. H command shows the help.
Code
' Line Editor
' Version 0.1
' Copyright © 2017 Nonki Takahashi. The MIT License.
' Known Issues
' [1] Can't display Unicode characters.
' [2] Can't delete lines.
Init()
While cont
ShowPrompt()
ReadCommand()
DoCommand()
EndWhile
Program.End()
Sub DoCommand
If cmd = "h" Or cmd = "?" Then
TextWindow.WriteLine("?|h - help")
TextWindow.WriteLine("i[<l1>,<l2>] - insert line[s] to file")
TextWindow.WriteLine("l[<l1>,<l2>|*] - list lines")
TextWindow.WriteLine("m<l> - move to a line")
TextWindow.WriteLine("q - quit")
TextWindow.WriteLine("r[<l1>,<l2>] - replace line[s] to file")
ElseIf cmd = "i" Then
If maxlno + 1 < l1 Then
For l = maxlno + 1 To l1 - 1
File.WriteLine(filename, l, "")
EndFor
EndIf
For l = l1 To l2
line = TextWindow.Read()
File.InsertLine(filename, l, line)
EndFor
maxlno = maxlno + l2 - l1 + 1
ElseIf cmd = "l" Then
For l = l1 To l2
sp = Text.GetSubText(" ", 1, Text.GetLength(l2) - Text.GetLength(l))
line = File.ReadLine(filename, l)
TextWindow.WriteLine(sp + l + " " + line)
EndFor
ElseIf cmd = "m" Then
If maxlno < l1 Then
curlno = maxlno
Else
curlno = l1
EndIf
ElseIf cmd = "q" Then
cont = "False"
ElseIf cmd = "r" Then
If 1 <= l1 And l1 <= l2 And l2 <= maxlno Then
For l = l1 To l2
line = TextWindow.Read()
File.WriteLine(filename, l, line)
EndFor
Else
msg = "Invalid lines: " + l1 + "," + l2
ShowError()
EndIf
Else
msg = "Unknown cmd: " + cmd
ShowError()
EndIf
EndSub
Sub GetCommand
' param cmdline - command line
' param p - pointer to command line
' return p - updated pointer to command line
' return cmd - command
cmd = ""
c = Text.ConvertToLowerCase(Text.GetSubText(cmdline, p, 1))
If Text.IsSubText("abcdefghijklmnopqrstuvwxyz?", c) Then
cmd = c
p = p + 1
EndIf
EndSub
Sub GetDelim
' param cmdline - command line
' param p - pointer to command line
' return p - updated pointer to command line
' return delim - delimiter
delim = ""
c = Text.GetSubText(cmdline, p, 1)
If c = "," Then
delim = c
p = p + 1
EndIf
EndSub
Sub GetLineNo
' param cmdline - command line
' param p - pointer to command line
' return p - updated pointer to command line
' return l1 - start line number
' return l2 - end line number
c = Text.GetSubText(cmdline, p, 1)
If c = "*" Then
l1 = 1
l2 = maxlno
Else
GetNum()
If n = "" Then
l1 = curlno
Else
l1 = n
EndIf
SkipSpace()
GetDelim()
If delim = "" Then
l2 = l1
Else
SkipSpace()
GetNum()
If n = "" Then
l2 = l1
Else
l2 = n
EndIf
EndIf
EndIf
EndSub
Sub GetMaxLineNo
' param filename
' return maxlno - max line number
maxlno = 0
buf = File.ReadContents(filename)
p = 1
len = Text.GetLength(buf)
While p < len
maxlno = maxlno + 1
eol = Text.GetIndexOf(Text.GetSubTextToEnd(buf, p), LF)
If eol = 0 Then
p = len
Else
p = p + eol
EndIf
EndWhile
EndSub
Sub GetNum
' param cmdline - command line
' param p - pointer to command line
' return p - updated pointer to command line
' return n - number
n = ""
c = Text.GetSubText(cmdline, p, 1)
While Text.IsSubText("0123456789", c)
n = Text.Append(n, c)
p = p + 1
c = Text.GetSubText(cmdline, p, 1)
EndWhile
EndSub
Sub Init
Not = "False=True;True=False;"
cont = "True"
LF = Text.GetCharacter(10)
If 0 < Program.ArgumentCount Then
filename = Program.GetArgument(1)
EndIf
While filename = ""
TextWindow.Write("Filename? ")
filename = TextWindow.Read()
EndWhile
If Not[Text.IsSubText(filename, "\")] Then
filename = Program.Directory + "\" + filename
EndIf
GetMaxLineNo()
TextWindow.WriteLine(maxlno + " lines")
curlno = 1
EndSub
Sub ReadCommand
cmdline = TextWindow.Read()
p = 1
SkipSpace()
GetCommand()
SkipSpace()
GetLineNo()
EndSub
Sub ShowError
' param msg - error message
TextWindow.ForegroundColor = "Red"
TextWindow.WriteLine(msg)
TextWindow.ForegroundColor = "Gray"
EndSub
Sub ShowPrompt
TextWindow.Write("> ")
EndSub
Sub SkipSpace
' param cmdline - command line
' param p - pointer to command line
' return p - updated pointer to command line
c = Text.GetSubText(cmdline, p, 1)
While c = " "
p = p + 1
c = Text.GetSubText(cmdline, p, 1)
EndWhile
EndSub