function model = mttFetchStruct(filename)
model.representation = 'struct' ;
mttAssert(mttFileExists(filename),...
['File "',filename,'" not found']) ;
mttNotify([' ...processing ',filename]) ;
mttWriteNewLine ;
model.source = mttCutText(filename,'_struct.txt') ;
content = mttReadFile(filename) ;
statements = mttExtractStatements(content) ;
number_of_statements = length(statements) ;
next = 0 ;
parsing = 1 ;
while parsing
next = next + 1 ;
statement = statements{next} ;
[keyword,line] = mttSeparateText(statement) ;
switch keyword
case {'struct','public_struct','private_struct'},
struct_name = line ;
mttValidateName(struct_name) ;
[struct,next] = fetch_struct(statements,next,struct_name) ;
model = setfield(model,'item',struct_name,struct) ;
is_private = strcmp(keyword,'private_struct') ;
model = setfield(model,'item',struct_name,'is_private',is_private) ;
case '{',
error('Unexpected "{" found') ;
case '}',
error('Unexpected "}" found') ;
otherwise,
error(['Unrecognised top-level keyword "',keyword,'"']) ;
end
if next==number_of_statements
parsing = 0 ;
end
end
function [struct,next] = fetch_struct(statements,next,struct_name)
struct = [] ;
unit_name = 'struct' ;
number_of_statements = length(statements) ;
counter = 0 ;
open = 0 ;
parsing = 1 ;
while parsing
next = next + 1 ;
statement = statements{next} ;
[keyword,line] = mttSeparateText(statement) ;
switch keyword
case 'var',
mttAssert(open,...
['"var" declarations must be contained inside {...} in "',unit_name,'"']) ;
mttAssert(~isempty(line),...
['Undefined "var" in "',unit_name,'"']) ;
data_name = line ;
mttValidateName(data_name) ;
counter = counter + 1 ;
struct.var(counter).name = data_name ;
struct.var(counter).type = [] ;
case '{',
mttAssert(~open,['Unmatched "{" in "',unit_name,'"']) ;
open = 1 ;
case '}',
mttAssert(open,['Unmatched "}" in "',unit_name,'"']) ;
open = 0 ;
otherwise,
mttAssert(open,...
['Declarations must be contained inside {...} in "',unit_name,'"']) ;
mttAssert(~isempty(line),...
['Empty declaration in "',unit_name,'"']) ;
data_name = line ;
mttValidateName(data_name) ;
data_type = keyword ;
mttValidateName(data_type) ;
counter = counter + 1 ;
struct.var(counter).name = data_name ;
struct.var(counter).type = data_type ;
end
mttAssert(~(open & (next==number_of_statements)),...
['Missing "}" in "',unit_name,'"']) ;
if (~open) | (next==number_of_statements)
parsing = 0 ;
end
end