-- serial ------------------------------- srl={}srl.sts={open="o",key="k", value="v"}srl.tok={open="{", close="}",ass="=",st1=",", st2=";",quote="\"",sp=" ",nl= "\n"}srl.strisnum=function(a) local b=tonum(a)local c=tostr(b) return a==c,b end;srl.strisbool= function(a)if a=="true"then return true,true elseif a== "false"then return true,false end;return false,nil end; srl.trim=function(a)local d=0; local e=0;local f;for g=1,#a do f=sub(a,g,g)if not(f==" "or f== "\n")then if d==0 then d=g;e=g else e=g end end end;return sub (a,d,e)end;srl.tostr=function(h) local a="{"local i=""for g,j in pairs(h)do a=a..tostr(g).."="i= type(j)if i=="number"then a=a.. tostr(j)elseif i=="string"then a=a..j elseif i=="boolean"then a=a..(j and"true"or"false") elseif i=="table"then a=a..srl. tostr(j)elseif i=="function"then a=a.."(f)"else a=a.."(r)"end;a=a ..";"end;a=a.."}"return a end; srl.fromstr=function(a,k)k=k or 1;local l={}local m=""local n="" local o=false;local p=""local q= ""local r=srl.sts.open;local g=1;while g<=#a do m=sub(a,g,g) if r==srl.sts.open then if m== srl.tok.open then r=srl.sts.key end elseif r==srl.sts.key then if m==srl.tok.close then return l,g+k-1 elseif m==srl.tok.ass then if#n>0 then n=srl.trim(n) p=n;n=""r=srl.sts.value end elseif m==srl.tok.st1 or m==srl. tok.st2 then if#n>0 then n=n..m end elseif m==" " or m== "\n" or m=="\t" then if#n>0 then n=n ..m end else n=n..m end elseif r==srl.sts.value then if m==srl. tok.open then if#n==0 then l[p], g=srl.fromstr(sub(a,g),g)end elseif m==srl.tok.close then n=n ..m elseif m==srl.tok.ass then n =n..m elseif m==srl.tok.st1 or m ==srl.tok.st2 then if#n>0 then q =srl.trim(n)local s,t=srl. strisnum(q)local u,v=srl. strisbool(q)if s then q=t elseif u then q=v end;n=""l[p]= q end;r=srl.sts.key elseif m== srl.tok.sp or m==srl.tok.nl then if#n>0 then n=n..m end else n=n.. m end end;g=g+1 end;return l end -------------------------------- |
Usage:
s = srl.tostr(t)
:: Converts a table to a string
t = srl.fromstr(s)
:: Converts a string back to a table.
Formatting and Differences:
- Strings aren't quoted. The parser will trim any whitespace before and after.
- Strings that look like numbers will always be turned to numbers.
- Strings that look like booleans will always be turned to booleans.
- The input string must have an opening and closing curly bracket.
- You must include a comma or semicolon after every entry, including the last one.
- The exception to the rule is the very last closing bracket.
nil
will be the string "nil" and not actual nil.- Keys are always strings.
Example:
{ a = 10; b = 20; c = { d = 12.34; e = some string; f = false; g = { h = true; }; }; } |
It's roughly 600 tokens, and could use further optimization.
But, it works! Now you can store game data in a string, which
costs only one token!
P#131764 2023-07-09 00:24 ( Edited 2023-07-09 01:50)
2
Version 2!
We're down to ~500 tokens!
-- serial -------------------------------- srl_strisnum=function(a)local b= tonum(a)local c=tostr(b)return a ==c,b end;srl_strisbool=function (a)if a=="true"then return true, true elseif a=="false"then return true,false end;return false,nil end;srl_trim=function(a)local d=0; local e=0;local f;for g=1,#a do f=sub(a,g,g)if not(f==" "or f== "\n")then if d==0 then d=g;e=g else e=g end end end;return sub (a,d,e)end;srl_tostr=function(h) local a="{"local i=""for g,j in pairs(h)do a=a..tostr(g).."="i= type(j)if i=="number"then a=a.. tostr(j)elseif i=="string"then a =a..j elseif i=="boolean"then a= a..(j and"true"or"false")elseif i=="table"then a=a..srl_tostr(j) elseif i=="function"then a=a.. "(f)"else a=a.."(r)"end;a=a..";" end;a=a.."}"return a end; srl_fromstr=function(a,k)k=k or 1;local l={}local m=""local n="" local o=false;local p=""local q= ""local r="o";local g=1;while g<= #a do m=sub(a,g,g)if r=="o" then if m=="{" then r="k"end elseif r =="k" then if m=="}" then return l,g+k-1 elseif m=="=" then if#n> 0 then n=srl_trim(n)p=n;n=""r= "v" end elseif m=="," or m==";" then if#n>0 then n=n..m end elseif m==" " or m=="\n" or m== "\t"then if#n>0 then n=n..m end else n=n..m end elseif r=="v" then if m=="{" then if#n==0 then l[p],g=srl_fromstr(sub(a,g),g) end elseif m=="}" then n=n..m elseif m=="=" then n=n..m elseif m=="," or m==";" then if #n>0 then q=srl_trim(n)local s,t =srl_strisnum(q)local u,v= srl_strisbool(q)if s then q=t elseif u then q=v end;n=""l[p]= q end;r="k" elseif m==" " or m =="\n"then if#n>0 then n=n..m end else n=n..m end end;g=g+1 end;return l end -------------------------------- |
P#131825 2023-07-11 03:25
[Please log in to post a comment]