Notice. New forum software under development. It's going to miss a few functions and look a bit ugly for a while, but I'm working on it full time now as the old forum was too unstable. Couple days, all good. If you notice any issues, please contact me.
|
Forum Index : Microcontroller and PC projects : double quote in strings: question
Author | Message | ||||
Volhout Guru Joined: 05/03/2018 Location: NetherlandsPosts: 4222 |
For most of you this will be simple, but I have not found a solution yet. In a basic program you can a$="hello" But if you want to execute this from a script file you have to EXECUTE " a$="hello" " But how to get the double quotes around the "hello". I tried ""hello"" and \"hello\" and chr$(34)hellochr$(34)... Just have not found it yet... anyone ? Volhout PicomiteVGA PETSCII ROBOTS |
||||
Martin H. Guru Joined: 04/06/2022 Location: GermanyPosts: 1113 |
? CHR$(34);"HELLO";CHR$(34) or a$=CHR$(34)+"HELLO"+CHR$(34) with EXECUTE I get an Error: Unknown command Edited 2024-10-04 20:25 by Martin H. 'no comment |
||||
matherp Guru Joined: 11/12/2012 Location: United KingdomPosts: 9105 |
a$=chr$(34)+hello+chr$(34) or PicoMite Manual page 27 OPTION ESCAPE a$="\qhello\q" a$="\031hello\031" |
||||
thwill Guru Joined: 16/09/2019 Location: United KingdomPosts: 4036 |
Presumably you mean: a$="\034hello\034" But IMO that's a snafu as (by C convention) that should be the syntax for an octal sequence, not a decimal sequence. If you aren't on the PicoMite then these might be of use: ' Decodes a string containing "C" escape codes. ' ' Note: does not handle octal escape codes. ' ' state%: ' 0 = base state ' 1 = looking for escape code ' 2 = expecting 1st hex digit ' 3 = expecting 2nd hex digit Function str.decode$(s$) Local ad%, ch%, prev%, state%, t$ For ad% = Peek(VarAddr s$) + 1 TO Peek(VarAddr s$) + Len(s$) ch% = Peek(Byte ad%) Select Case ch% Case &h5C ' \ state% = 1 Case Else Select Case state% Case 0 Cat t$, Chr$(ch%) Case 1 Select Case ch% Case &h22 : ch% = &h22 ' \" Case &h27 : ch% = &h27 ' \' Case &h30 : ch% = &h00 ' \0 Case &h3F : ch% = &h3F ' \? Case &h5C : ch% = &h5C ' \ Case &h61 : ch% = &h07 ' \a Case &h62 : ch% = &h08 ' \b Case &h65 : ch% = &h1B ' \e Case &h66 : ch% = &h0C ' \f Case &h6E : ch% = &h0A ' \n Case &h71 : ch% = &h22 ' \q Case &h72 : ch% = &h0D ' \r Case &h74 : ch% = &h09 ' \t Case &h76 : ch% = &h0B ' \v Case &h78 : state% = 2 ' \x Case Else : Cat t$, "\" End Select If state% = 1 Then Cat t$, Chr$(ch%) state% = 0 EndIf Case 2 Select Case ch% Case &h30 To &h39, &h41 To &h46, &h61 To &h66 ' 0-9, A-F, a-f prev% = ch% state% = 3 Case Else Cat t$, "\x" + Chr$(ch%) state% = 0 End Select Case 3 Select Case ch% Case &h30 To &h39, &h41 To &h46, &h61 To &h66 ' 0-9, A-F, a-f Cat t$, Chr$(Val("&h" + Chr$(prev%) + Chr$(ch%))) Case Else Cat t$, "\x" + Chr$(prev%) + Chr$(ch%) End Select state% = 0 End Select End Select Next Select Case state% Case 1 : Cat t$, "\" Case 2 : Cat t$, "\x" Case 3 : Cat t$, "\x" + Chr$(prev%) End Select str.decode$ = t$ End Function ' Encodes a string using "C" escape codes. Function str.encode$(s$) Local ad%, ch%, t$ For ad% = Peek(VarAddr s$) + 1 TO Peek(VarAddr s$) + Len(s$) ch% = Peek(Byte ad%) Select Case ch% Case &h00 : Cat t$, "\0" Case &h07 : Cat t$, "\a" Case &h08 : Cat t$, "\b" Case &h09 : Cat t$, "\t" Case &h0A : Cat t$, "\n" Case &h0B : Cat t$, "\v" Case &h0C : Cat t$, "\f" Case &h0D : Cat t$, "\r" Case &h1B : Cat t$, "\e" Case &h22 : Cat t$, "\q" Case &h27 : Cat t$, "\'" Case &h3F : Cat t$, "\?" Case &h5C : Cat t$, "\\" Case < &h20, >= &h7F : Cat t$, "\x" + Hex$(ch%, 2) Case Else : Cat t$, Chr$(ch%) End Select Next str.encode$ = t$ End Function allowing you to write either: a$=str.decode$("\qhello\q") or: a$=str.decode$("\x22hello\x22") Best wishes, Tom Edited 2024-10-04 20:52 by thwill Game*Mite, CMM2 Welcome Tape, Creaky old text adventures |
||||
matherp Guru Joined: 11/12/2012 Location: United KingdomPosts: 9105 |
Nobody uses octal anymore so I re-purposed that syntax - yes it should be \034 From the manual |
||||
thwill Guru Joined: 16/09/2019 Location: United KingdomPosts: 4036 |
Whilst I personally stay clear of octal I still think it dangerous to subvert convention in an engineering context such as a programming language. YMMV, Tom Game*Mite, CMM2 Welcome Tape, Creaky old text adventures |
||||
Volhout Guru Joined: 05/03/2018 Location: NetherlandsPosts: 4222 |
Thank you for your help. Volhout PicomiteVGA PETSCII ROBOTS |
||||
thwill Guru Joined: 16/09/2019 Location: United KingdomPosts: 4036 |
... though I now observe you are not the only one to have done it : https://freebasic.net/wiki/TblEscapeSequences I'll get back in my box, Tom Game*Mite, CMM2 Welcome Tape, Creaky old text adventures |
||||
disco4now Guru Joined: 18/12/2014 Location: AustraliaPosts: 896 |
The EXECUTE command expects a string. Use chr$(34) to put the extra quotes.(or OPTION ESCAPE with \q ) pass to EXECUTE as below. execute "a$="+chr$(34)+"hello world"+chr$(34) > ? a$ hello world Latest F4 Latest H7 |
||||
Volhout Guru Joined: 05/03/2018 Location: NetherlandsPosts: 4222 |
Thank you for your help. I looked at your proposals and I feel so stupid. I wanto to add test to a log (in this case a text array called r$() and use pointer i. This routine will later change into writing to a file in the filesystem. sub add_log(a$) r$(i)=a$ inc i,1 end sub I run a script file, and when it it should store text in the log file this is the current code (I want to execute txt$). read command$ select case command$ case "EXE" read p:read txt$ execute txt$+chr$(13) The txt$ is read from DATA statements data "EXE",0,"add_log(str$(a)+chr$(32)+chr$(109)+chr$(87))" and above works. It adds the value of a (i.e. 100), and then the text " mW". i.e. "100 mW" to r$(i) I try to use the escape codes, so I won't have to translate every ASCII character manually. So I try... data "EXE",0,"add_log(str$(a)+\q mW\q)" data "EXE",0,"add_log(str$(a)+"\q mW\q")" data "EXE",0,"add_log(str$(a)\q mW\q)" data "EXE",0,"add_log(str$(a)"\q mW\q")" O coarse I also tried \034. B.T.W. MMB4L does error on OPTION ESCAPE Volhout Edited 2024-10-04 21:40 by Volhout PicomiteVGA PETSCII ROBOTS |
||||
thwill Guru Joined: 16/09/2019 Location: United KingdomPosts: 4036 |
Yes, sorry @Volhout, I don't think I'll ever implement OPTION ESCAPE* in MMB4L, though I have been considering: a$ = c"String using C escape sequences" a$ = !"String using FreeBASIC escape sequences" or something similar. In the meantime str.encode$() and str.decode$() are your friend . * At the risk of controversy I think it's a broken design. One issue (in addition to being different from C escapes) is that because it's not on a per-string basis Peter had to "hack" around any place where a string was being used as a file path (which frequently contain the \ character but don't mean it to introduce an escape). YMMV, Tom Edited 2024-10-04 21:50 by thwill Game*Mite, CMM2 Welcome Tape, Creaky old text adventures |
||||
Mixtel90 Guru Joined: 05/10/2019 Location: United KingdomPosts: 6778 |
I've seen BASIC implementations that allow both single and double quotes. You have to match the pairs though: print "'this is a string'" 'this is a string' print '"this is another"' "this is another" print "'a load of rubbish"' 'a load of rubbish (and probably an error message) Neat, but probably non-standard. Mick Zilog Inside! nascom.info for Nascom & Gemini Preliminary MMBasic docs & my PCB designs |
||||
JohnS Guru Joined: 18/11/2011 Location: United KingdomPosts: 3800 |
Mick, ... and then can't have comments starting with a single quote (I guess). John |
||||
JohnS Guru Joined: 18/11/2011 Location: United KingdomPosts: 3800 |
I suspect the chr$(13) is not needed. John |
||||
Mixtel90 Guru Joined: 05/10/2019 Location: United KingdomPosts: 6778 |
Good point, John. I can't honestly remember. Mick Zilog Inside! nascom.info for Nascom & Gemini Preliminary MMBasic docs & my PCB designs |
||||
toml_12953 Guru Joined: 13/02/2015 Location: United StatesPosts: 339 |
In some BASICs (such as ANSI) you can do this: a$="She said, ""I see the tower!""" using two quotation marks to mean one. In some you can use either the apostrophe or quotation mark like this: a$='She said, "I can see the tower!"' b$="This is Sam's coat" whichever mark is needed inside, the opposite one is used to enclose the entire string. |
||||
Print this page |