start of splubp prototype
This commit is contained in:
		
							
								
								
									
										97
									
								
								splubp.p8
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								splubp.p8
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,97 @@ | |||||||
|  | pico-8 cartridge // http://www.pico-8.com | ||||||
|  | version 42 | ||||||
|  | __lua__ | ||||||
|  | -- splubp data transport | ||||||
|  | -- by kistaro windrider | ||||||
|  |  | ||||||
|  | -- main | ||||||
|  |  | ||||||
|  | -- >8 | ||||||
|  | -- utilities | ||||||
|  |  | ||||||
|  | -- generate standard "overlay" | ||||||
|  | -- constructor for type tt. | ||||||
|  | -- if tt.init is defined, generated | ||||||
|  | -- new calls tt.init(ret) after | ||||||
|  | -- ret is definitely not nil, | ||||||
|  | -- after calling setmetatable. | ||||||
|  | -- use to initialize mutables. | ||||||
|  | -- | ||||||
|  | -- if there was a previous new, | ||||||
|  | -- it is invoked before | ||||||
|  | -- setting tt's metatable, so | ||||||
|  | -- each new will see its | ||||||
|  | -- inheritance chain. | ||||||
|  | function mknew(tt) | ||||||
|  |  local mt,oldinit,more = {__index=tt},tt.superinit,rawget(tt, "init") | ||||||
|  |  tt.new=function(ret) | ||||||
|  |   if(not ret) ret = {} | ||||||
|  |   ret.new = false | ||||||
|  |   setmetatable(ret, mt) | ||||||
|  |   if(oldinit) oldinit(ret) | ||||||
|  |   if (more) more(ret) | ||||||
|  |   return ret | ||||||
|  |  end | ||||||
|  |  | ||||||
|  |  if oldinit and more then | ||||||
|  |   tt.superinit = function(ret) | ||||||
|  |    oldinit(ret) | ||||||
|  |    more(ret) | ||||||
|  |   end | ||||||
|  |  elseif more then | ||||||
|  |   tt.superinit = more | ||||||
|  |  end | ||||||
|  |  return tt | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function set(t) | ||||||
|  |  local ret = {} | ||||||
|  |  for v in all(t) do | ||||||
|  |   ret[v]=true | ||||||
|  |  end | ||||||
|  |  return ret | ||||||
|  | end | ||||||
|  |  | ||||||
|  | whitespace = set(split" ,\t,\n") | ||||||
|  |  | ||||||
|  | function trim(s) | ||||||
|  |  local f, e = 1, #s | ||||||
|  |  while (f <= e and whitespace[s[f]]) f += 1 | ||||||
|  |  while (e >= f and whitespace[s[e]]) e -= 1 | ||||||
|  |  if (f<e) return sub(s,f,e) | ||||||
|  |  return "" | ||||||
|  | end | ||||||
|  |  | ||||||
|  | -- >8 | ||||||
|  | -- writer | ||||||
|  |  | ||||||
|  | splubp_writer = mknew{ | ||||||
|  |  init = function(self) | ||||||
|  |   -- fill from single file | ||||||
|  |   self.fmts = self.fmts or {} | ||||||
|  |   if self.ffile then | ||||||
|  |    for f in all(split(self.ffile, "===", false)) do | ||||||
|  |     local ext, fmt = split(f, "---") | ||||||
|  |     self.fmts[trim(ext)] = trim(fmt) | ||||||
|  |    end | ||||||
|  |   end | ||||||
|  |  end | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | -->8 | ||||||
|  | -- loader | ||||||
|  |  | ||||||
|  | -- essay: `e` directive | ||||||
|  | -- reads int16 char count, | ||||||
|  | -- then parses that many bytes | ||||||
|  | -- into a string (via chr). | ||||||
|  | -- returns string, new read offset. | ||||||
|  | function splubp_read_essay(addr) | ||||||
|  |  local cs, n = {}, %addr | ||||||
|  |  for a2 = addr+2, addr+n+1 do | ||||||
|  |   add(cs, @a2) | ||||||
|  |  end | ||||||
|  |  return chr(unpack(cs)), addr+2+n | ||||||
|  | end | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user