Technote: Programs and Notes -- May 23 1996
10: How to turn Notes into Programs
=========================================================
[Contributed by Henry Melton (hmelton@io.com) of Hutto, Texas]
One project that I wanted was the ability to move BASIC programs back and
forth from notes to NSBASIC. Moving programs in and out the serial port
is easy, and I think it can even be done over the IR port, but I wanted
a totally standalone situation where I could build up programs from
libraries
while at an airport or at lunch. A sample program that writes
programs to notes is in the documentation, but I wanted one that would
read notes and make it into a program. I have already turned all the
sample program files into Paperback packages. I wanted to cut and paste
interesting code into a note and then read it in.
Well, I succeeded, in spite of the Create command only allowing string
keys.
NSBASIC has the ability to LIST a program to a simple soup and then ENTER
it back in allowing code merge. I wrote a program that reads a note and
then writes it to this simple list soup. To get around the inability to
Create the soup, I manually list a non-existant range of numbers to a
soup. Here are the steps:
Paste the program into the only note in the BASIC folder.
in NSBASIC:
LIST 1,2,temp
RUN Notes2BAS
NEW
ENTER temp.txt
Here is the code to Notes2BAS for NS BASIC 3.0 and earlier:
0010 open o,"temp.txt",recNo
0060 LET r=0
0070 LET sym=intern("BASIC")
0080 open x,"notes"
0090 get x,y
0100 if fstat = 1 then end
0110 if y.labels=(sym) then gosub 0130
0120 GOTO 0090
0130 rem print contents
0140 for i=0 to length(y.data)-1
0150 LET a$= y.data[i].text
0160 GOSUB 0190 //Write Lines
0170 next i
0180 return
0190 REM Write Lines
0200 if strlen(a$) = 0 then return
0210 GOSUB 0250 //Write First Line
0220 if fstat > 0 then stop
0230 LET r=r+1
0240 GOTO 0200
0250 REM Write First Line
0260 LET ret$=chr(13)
0270 LET j=strpos(a$,ret$,0)
0280 if j=NIL then goto 0380
0290 LET b$=substr(a$,0,j)
0300 LET c$=substr(a$,j+1,NIL)
0310 print "writing",r,b$
0320 LET t={}
0330 LET t.recno=r
0340 LET t.text=b$
0350 put o,t
0360 LET a$=c$
0370 return
0380 print "writing",r,a$
0390 LET t={}
0400 LET t.recno=r
0410 LET t.text=a$
0420 put o,t
0430 LET a$=""
0440 return
Here is a program that puts a program into the Notes file.
This is for Rev 3.5 and higher: the program file layout has changed a bit.
10 REM List2Notes V2.1
20 LET defaultFont=0
30 LET f=getStores()[1]:getSoupNames()
40 LET b=["None -- Exit","All Programs"]
50 for i=0 to length(f)-1
60 LET r=strpos(f[i],":NSBASIC",0)
70 if r then addArraySlot(b,f[i])
80 next i
90 LET wb={Text:"BASIC
Program",labelCommands:b,goto:0350,viewbounds:{left:10,right:200,top:50,bottom:80}}
100 window b1,wb,"labelpicker"
110 show b1
120 wait 1000
130 cls
140 print " List to Notes -- Choose Program"
150 GOTO 0120
160 LET fname=b[wb.viewvalue]
170 LET ts=time()
180 open pch,fname,lineno
190 if fstat > 0 then bye
200 print fname&&"Copy started."
210 LET x=""
220 get pch,stmt
225 if fstat=1 then goto 260
230 if Stmt.text=nil Then goto 0220
235 If Stmt.lineno > 199999 Then LET nn=stmt.lineno - 200000
240 LET x=x&nn&&Stmt.text&chr(13)
250 GOTO 0220
260 close pch
270 open ch,"notes",timestamp
280 if fstat>0 then stop
290 LET
n={class:'paperroll,data:[{ViewStationery:'para,viewBounds:{left:0,right:239,top:0,bottom:100},text:x}],viewstationery:'paperroll,height:1000,labels:'BASIC,
timeStamp:ts}
300 If DefaultFont > 0 Then n.data[0].viewfont=defaultFont Else
n.data[0].viewfont=getglobals().userconfiguration.userfont
310 put ch,n
320 if fstat > 0 then print "Failed." else print "Completed."
330 close ch
340 return
350 if wb.viewvalue = 0 then bye
360 if wb.viewvalue = 1 then goto 0390
370 GOSUB 0160
380 GOTO 0120
390 hide
400 LET ts=time()
410 for fx=2 to length(b)-1
420 LET fname=b[fx]
430 GOSUB 0180
440 LET ts=ts+1
450 next fx
460 bye