diff --git a/loadbj.m b/loadbj.m index 589b787f736ba3f47d74582384c9c451249fb986..9ccd47ff1a534cb68215751151d6a80847aff7b6 100644 --- a/loadbj.m +++ b/loadbj.m @@ -151,7 +151,7 @@ function [data, mmap] = loadbj(fname,varargin) [data{jsoncount}, pos] = parse_array(inputstr, pos, opt); end case {'S','C','H','i','U','I','u','l','m','L','M','h','d','D','T','F','Z','N'} - [data{jsoncount}, pos] = parse_value(inputstr, pos, opt); + [data{jsoncount}, pos] = parse_value(inputstr, pos, [], opt); otherwise error_pos('Outer level structure must be an object or an array', inputstr, pos); end @@ -194,6 +194,28 @@ end %%------------------------------------------------------------------------- function [data, adv]=parse_block(inputstr, pos, type,count,varargin) + if(count>=0 && ~isempty(type) && strfind('HSC{[TFN', type)) + adv=0; + switch(type) + case {'S', 'H', '{', '['} + data=cell(1,count); + adv=pos; + for i=1:count + [data{i}, pos] = parse_value(inputstr, pos, type, varargin{:}); + end + adv=pos-adv; + case 'C' + data=inputstr(pos:pos+count); + adv=count; + case 'T' + data=true(1,count); + case 'F' + data=false(1,count); + case 'N' + data=cell(1,count); + end + return; + end [cid,len]=elem_info(inputstr, pos, type); datastr=inputstr(pos:pos+len*count-1); newdata=uint8(datastr); @@ -262,11 +284,11 @@ function [object, pos, mmap] = parse_array(inputstr, pos, varargin) % JSON arra if(nargout>2) varargin{1}.jsonpath_=[origpath '.' sprintf('[%d]',length(object))]; mmap{end+1}={varargin{1}.jsonpath_, pos}; - [val, pos, newmmap] = parse_value(inputstr, pos, varargin{:}); + [val, pos, newmmap] = parse_value(inputstr, pos, [], varargin{:}); mmap{end}{2}=[mmap{end}{2}, pos-mmap{end}{2}]; mmap=[mmap(:);newmmap(:)]; else - [val, pos] = parse_value(inputstr, pos, varargin{:}); + [val, pos] = parse_value(inputstr, pos, [], varargin{:}); end object{end+1} = val; [cc,pos]=next_char(inputstr,pos); @@ -342,13 +364,16 @@ end %%------------------------------------------------------------------------- -function [str, pos] = parseStr(inputstr, pos, varargin) - type=inputstr(pos); - if type ~= 'S' && type ~= 'C' && type ~= 'H' - error_pos('String starting with S expected at position %d',inputstr, pos); - else - pos = pos + 1; +function [str, pos] = parseStr(inputstr, pos, type, varargin) + if(isempty(type)) + type=inputstr(pos); + if type ~= 'S' && type ~= 'C' && type ~= 'H' + error_pos('String starting with S expected at position %d',inputstr, pos); + else + pos = pos + 1; + end end + if(type == 'C') str=inputstr(pos); pos=pos+1; @@ -387,14 +412,19 @@ end %%------------------------------------------------------------------------- -function varargout = parse_value(inputstr, pos, varargin) - [cc,varargout{2}]=next_char(inputstr,pos); +function varargout = parse_value(inputstr, pos, type, varargin) + if(length(type)==1) + cc=type; + varargout{2}=pos; + else + [cc,varargout{2}]=next_char(inputstr,pos); + end if(nargout>2) varargout{3}={}; end switch(cc) case {'S','C','H'} - [varargout{1:2}] = parseStr(inputstr, varargout{2}, varargin{:}); + [varargout{1:2}] = parseStr(inputstr, varargout{2}, type, varargin{:}); return; case '[' [varargout{1:nargout}] = parse_array(inputstr, varargout{2}, varargin{:}); @@ -461,7 +491,7 @@ function [object, pos, mmap] = parse_object(inputstr, pos, varargin) num=0; while 1 if(varargin{1}.nameisstring) - [str, pos] = parseStr(inputstr, pos, varargin{:}); + [str, pos] = parseStr(inputstr, pos, [], varargin{:}); else [str, pos] = parse_name(inputstr, pos, varargin{:}); end @@ -471,11 +501,11 @@ function [object, pos, mmap] = parse_object(inputstr, pos, varargin) if(nargout>2) varargin{1}.jsonpath_=[origpath,'.',str]; mmap{end+1}={varargin{1}.jsonpath_,pos}; - [val, pos,newmmap] = parse_value(inputstr, pos, varargin{:}); + [val, pos,newmmap] = parse_value(inputstr, pos, [], varargin{:}); mmap{end}{2}=[mmap{end}{2}, pos-mmap{end}{2}]; mmap=[mmap(:);newmmap(:)]; else - [val, pos] = parse_value(inputstr, pos, varargin{:}); + [val, pos] = parse_value(inputstr, pos, [], varargin{:}); end num=num+1; if(usemap)