Skip to content

Commit 4e88f2f

Browse files
author
fangq
committed
implement the UBJSON Draft12 new name format
git-svn-id: http://svn.code.sf.net/p/iso2mesh/code/trunk/jsonlab@465 786e58fb-9377-0410-9ff7-e4ac0ac0635c
1 parent 9433014 commit 4e88f2f

File tree

2 files changed

+44
-21
lines changed

2 files changed

+44
-21
lines changed

loadubjson.m

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
% in the UBJSON input data. B - Big-Endian format for
2727
% integers (as required in the UBJSON specification);
2828
% L - input integer fields are in Little-Endian order.
29+
% opt.NameIsString [0|1]: for UBJSON Specification Draft 8 or
30+
% earlier versions (JSONLab 1.0 final or earlier),
31+
% the "name" tag is treated as a string. To load
32+
% these UBJSON data, you need to manually set this
33+
% flag to 1.
2934
%
3035
% output:
3136
% dat: a cell array, where {...} blocks are converted into cell arrays,
@@ -200,7 +205,11 @@
200205
if next_char ~= '}'
201206
num=0;
202207
while 1
203-
str = parseStr(varargin{:});
208+
if(jsonopt('NameIsString',0,varargin{:}))
209+
str = parseStr(varargin{:});
210+
else
211+
str = parse_name(varargin{:});
212+
end
204213
if isempty(str)
205214
error_pos('Name of value at position %d cannot be empty');
206215
end
@@ -347,8 +356,19 @@ function parse_char(c)
347356
end
348357

349358
%%-------------------------------------------------------------------------
359+
function str = parse_name(varargin)
360+
global pos inStr
361+
bytelen=double(parse_number());
362+
if(length(inStr)>=pos+bytelen-1)
363+
str=inStr(pos:pos+bytelen-1);
364+
pos=pos+bytelen;
365+
else
366+
error_pos('End of file while expecting end of name');
367+
end
368+
%%-------------------------------------------------------------------------
369+
350370
function str = parseStr(varargin)
351-
global pos inStr esc index_esc len_esc
371+
global pos inStr
352372
% len, ns = length(inStr), keyboard
353373
type=inStr(pos);
354374
if type ~= 'S' && type ~= 'C' && type ~= 'H'

saveubjson.m

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,13 @@
148148
len=numel(item); % let's handle 1D cell first
149149
if(len>1)
150150
if(~isempty(name))
151-
txt=[S_(checkname(name,varargin{:})) '[']; name='';
151+
txt=[N_(checkname(name,varargin{:})) '[']; name='';
152152
else
153153
txt='[';
154154
end
155155
elseif(len==0)
156156
if(~isempty(name))
157-
txt=[S_(checkname(name,varargin{:})) 'Z']; name='';
157+
txt=[N_(checkname(name,varargin{:})) 'Z']; name='';
158158
else
159159
txt='Z';
160160
end
@@ -182,7 +182,7 @@
182182
len=numel(item);
183183

184184
if(~isempty(name))
185-
if(len>1) txt=[S_(checkname(name,varargin{:})) '[']; end
185+
if(len>1) txt=[N_(checkname(name,varargin{:})) '[']; end
186186
else
187187
if(len>1) txt='['; end
188188
end
@@ -191,7 +191,7 @@
191191
for i=1:dim(1)
192192
names = fieldnames(item(i,j));
193193
if(~isempty(name) && len==1)
194-
txt=[txt S_(checkname(name,varargin{:})) '{'];
194+
txt=[txt N_(checkname(name,varargin{:})) '{'];
195195
else
196196
txt=[txt '{'];
197197
end
@@ -217,15 +217,15 @@
217217
len=size(item,1);
218218

219219
if(~isempty(name))
220-
if(len>1) txt=[S_(checkname(name,varargin{:})) '[']; end
220+
if(len>1) txt=[N_(checkname(name,varargin{:})) '[']; end
221221
else
222222
if(len>1) txt='['; end
223223
end
224224
isoct=jsonopt('IsOctave',0,varargin{:});
225225
for e=1:len
226226
val=item(e,:);
227227
if(len==1)
228-
obj=['' S_(checkname(name,varargin{:})) '' '',S_(val),''];
228+
obj=[N_(checkname(name,varargin{:})) '' '',S_(val),''];
229229
if(isempty(name)) obj=['',S_(val),'']; end
230230
txt=[txt,'',obj];
231231
else
@@ -244,13 +244,13 @@
244244
isempty(item) || jsonopt('ArrayToStruct',0,varargin{:}))
245245
cid=I_(uint32(max(size(item))));
246246
if(isempty(name))
247-
txt=['{' S_('_ArrayType_'),S_(class(item)),S_('_ArraySize_'),I_a(size(item),cid(1)) ];
247+
txt=['{' N_('_ArrayType_'),S_(class(item)),N_('_ArraySize_'),I_a(size(item),cid(1)) ];
248248
else
249249
if(isempty(item))
250-
txt=[S_(checkname(name,varargin{:})),'Z'];
250+
txt=[N_(checkname(name,varargin{:})),'Z'];
251251
return;
252252
else
253-
txt=[S_(checkname(name,varargin{:})),'{',S_('_ArrayType_'),S_(class(item)),S_('_ArraySize_'),I_a(size(item),cid(1))];
253+
txt=[N_(checkname(name,varargin{:})),'{',N_('_ArrayType_'),S_(class(item)),N_('_ArraySize_'),I_a(size(item),cid(1))];
254254
end
255255
end
256256
else
@@ -259,9 +259,9 @@
259259
else
260260
if(numel(item)==1 && jsonopt('NoRowBracket',1,varargin{:})==1)
261261
numtxt=regexprep(regexprep(matdata2ubjson(item,level+1,varargin{:}),'^\[',''),']','');
262-
txt=[S_(checkname(name,varargin{:})) numtxt];
262+
txt=[N_(checkname(name,varargin{:})) numtxt];
263263
else
264-
txt=[S_(checkname(name,varargin{:})),matdata2ubjson(item,level+1,varargin{:})];
264+
txt=[N_(checkname(name,varargin{:})),matdata2ubjson(item,level+1,varargin{:})];
265265
end
266266
end
267267
return;
@@ -276,29 +276,29 @@
276276
% (Necessary for complex row vector handling below.)
277277
data=data';
278278
end
279-
txt=[txt,S_('_ArrayIsComplex_'),'T'];
279+
txt=[txt,N_('_ArrayIsComplex_'),'T'];
280280
end
281-
txt=[txt,S_('_ArrayIsSparse_'),'T'];
281+
txt=[txt,N_('_ArrayIsSparse_'),'T'];
282282
if(size(item,1)==1)
283283
% Row vector, store only column indices.
284-
txt=[txt,S_('_ArrayData_'),...
284+
txt=[txt,N_('_ArrayData_'),...
285285
matdata2ubjson([iy(:),data'],level+2,varargin{:})];
286286
elseif(size(item,2)==1)
287287
% Column vector, store only row indices.
288-
txt=[txt,S_('_ArrayData_'),...
288+
txt=[txt,N_('_ArrayData_'),...
289289
matdata2ubjson([ix,data],level+2,varargin{:})];
290290
else
291291
% General case, store row and column indices.
292-
txt=[txt,S_('_ArrayData_'),...
292+
txt=[txt,N_('_ArrayData_'),...
293293
matdata2ubjson([ix,iy,data],level+2,varargin{:})];
294294
end
295295
else
296296
if(isreal(item))
297-
txt=[txt,S_('_ArrayData_'),...
297+
txt=[txt,N_('_ArrayData_'),...
298298
matdata2ubjson(item(:)',level+2,varargin{:})];
299299
else
300-
txt=[txt,S_('_ArrayIsComplex_'),'T'];
301-
txt=[txt,S_('_ArrayData_'),...
300+
txt=[txt,N_('_ArrayIsComplex_'),'T'];
301+
txt=[txt,N_('_ArrayData_'),...
302302
matdata2ubjson([real(item(:)) imag(item(:))],level+2,varargin{:})];
303303
end
304304
end
@@ -385,6 +385,9 @@
385385
end
386386
end
387387
%%-------------------------------------------------------------------------
388+
function val=N_(str)
389+
val=[I_(int32(length(str))) str];
390+
%%-------------------------------------------------------------------------
388391
function val=S_(str)
389392
if(length(str)==1)
390393
val=['C' str];

0 commit comments

Comments
 (0)