%% HDF5/MATLAB Variable-Length String Example
% Written By: Jason Kaeding
%       Date: May 12, 2009
%
% Demonstrates how to write then read varaible-length strings to/from HDF5
% files.  Also demonstrates how to setup the unlimited-length dataset so
% that any number of cellstr elements could be stored.

%% WRITE PORTION OF THIS EXAMPLE
% Generate cellstr (a cell array of strings)
% First element is '0123456789'
% Second element is 'abcdefghijklmnopqrstuvwxyz'
str = {'0':'9';'a':'z'};

% Generate a file
fid = H5F.create('vlen_string_test.h5','H5F_ACC_TRUNC',...
    'H5P_DEFAULT','H5P_DEFAULT');

% Set variable length string type
VLstr_type = H5T.copy('H5T_C_S1');
H5T.set_size(VLstr_type,'H5T_VARIABLE');

% Create a dataspace for cellstr
H5S_UNLIMITED = H5ML.get_constant_value('H5S_UNLIMITED');
dspace = H5S.create_simple(1,numel(str),H5S_UNLIMITED);

% Create a dataset plist for chunking
plist = H5P.create('H5P_DATASET_CREATE');
H5P.set_chunk(plist,2); % 2 strings per chunk

% Create dataset
dset = H5D.create(fid,'VLstr',VLstr_type,dspace,plist);

% Write data
H5D.write(dset,VLstr_type,'H5S_ALL','H5S_ALL','H5P_DEFAULT',str);

% Close file & resources
H5P.close(plist);
H5T.close(VLstr_type);
H5S.close(dspace);
H5D.close(dset);
H5F.close(fid);


%% READ PORTION OF THIS EXAMPLE
% Open file
fid = H5F.open('vlen_string_test.h5','H5F_ACC_RDONLY','H5P_DEFAULT');

% Set variable length string type
VLstr_type = H5T.copy('H5T_C_S1');
H5T.set_size(VLstr_type,'H5T_VARIABLE');

% Open dataset
dset = H5D.open(fid,'VLstr');

% Read data
str_data = H5D.read(dset,VLstr_type,'H5S_ALL','H5S_ALL','H5P_DEFAULT');

% Close file & resources
H5T.close(VLstr_type);
H5D.close(dset);
H5F.close(fid);

% NOTE: Because variable strings are treated as 1-column cellstr, no 
% transpose is needed.
disp('Original cellstr:');
disp(str);
disp('Read cellstr from file:');
disp(str_data);