annotate submitWeb.m @ 5:eddd33e57f6a default tip

Justify loop in trainLinearReg
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Sun, 27 Nov 2011 15:58:14 -0500
parents 0f14514e907f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
1 function submitWeb(partId)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
2 %SUBMITWEB Generates a base64 encoded string for web-based submissions
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
3 % SUBMITWEB() will generate a base64 encoded string so that you can submit your
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
4 % solutions via a web form
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
5
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
6 fprintf('==\n== [ml-class] Submitting Solutions | Programming Exercise %s\n==\n', ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
7 homework_id());
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
8 if ~exist('partId', 'var') || isempty(partId)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
9 partId = promptPart();
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
10 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
11
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
12 % Check valid partId
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
13 partNames = validParts();
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
14 if ~isValidPartId(partId)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
15 fprintf('!! Invalid homework part selected.\n');
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
16 fprintf('!! Expected an integer from 1 to %d.\n', numel(partNames));
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
17 fprintf('!! Submission Cancelled\n');
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
18 return
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
19 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
20
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
21 [login] = loginPrompt();
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
22 if isempty(login)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
23 fprintf('!! Submission Cancelled\n');
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
24 return
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
25 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
26
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
27 [result] = submitSolution(login, partId, output(partId), ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
28 source(partId));
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
29 result = base64encode(result);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
30
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
31 fprintf('\nSave as submission file [submit_ex%s_part%d.txt]: ', ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
32 homework_id(), partId);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
33 saveAsFile = input('', 's');
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
34 if (isempty(saveAsFile))
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
35 saveAsFile = sprintf('submit_ex%s_part%d.txt', homework_id(), partId);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
36 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
37
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
38 fid = fopen(saveAsFile, 'w');
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
39 if (fid)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
40 fwrite(fid, result);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
41 fclose(fid);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
42 fprintf('\nSaved your solutions to %s.\n\n', saveAsFile);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
43 fprintf(['You can now submit your solutions through the web \n' ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
44 'form in the programming exercises. Select the corresponding \n' ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
45 'programming exercise to access the form.\n']);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
46
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
47 else
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
48 fprintf('Unable to save to %s\n\n', saveAsFile);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
49 fprintf(['You can create a submission file by saving the \n' ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
50 'following text in a file: (press enter to continue)\n\n']);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
51 pause;
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
52 fprintf(result);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
53 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
54
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
55 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
56
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
57 % ================== CONFIGURABLES FOR EACH HOMEWORK ==================
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
58
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
59 function id = homework_id()
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
60 id = '5';
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
61 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
62
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
63 function [partNames] = validParts()
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
64 partNames = { 'Regularized Linear Regression Cost Function', ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
65 'Regularized Linear Regression Gradient', ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
66 'Learning Curve', ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
67 'Polynomial Feature Mapping' ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
68 'Validation Curve' ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
69 };
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
70 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
71
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
72 function srcs = sources()
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
73 % Separated by part
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
74 srcs = { { 'linearRegCostFunction.m' }, ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
75 { 'linearRegCostFunction.m' }, ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
76 { 'learningCurve.m' }, ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
77 { 'polyFeatures.m' }, ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
78 { 'validationCurve.m' } };
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
79 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
80
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
81 function out = output(partId)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
82 % Random Test Cases
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
83 X = [ones(10,1) sin(1:1.5:15)' cos(1:1.5:15)'];
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
84 y = sin(1:3:30)';
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
85 Xval = [ones(10,1) sin(0:1.5:14)' cos(0:1.5:14)'];
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
86 yval = sin(1:10)';
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
87 if partId == 1
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
88 [J] = linearRegCostFunction(X, y, [0.1 0.2 0.3]', 0.5);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
89 out = sprintf('%0.5f ', J);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
90 elseif partId == 2
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
91 [J, grad] = linearRegCostFunction(X, y, [0.1 0.2 0.3]', 0.5);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
92 out = sprintf('%0.5f ', grad);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
93 elseif partId == 3
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
94 [error_train, error_val] = ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
95 learningCurve(X, y, Xval, yval, 1);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
96 out = sprintf('%0.5f ', [error_train(:); error_val(:)]);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
97 elseif partId == 4
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
98 [X_poly] = polyFeatures(X(2,:)', 8);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
99 out = sprintf('%0.5f ', X_poly);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
100 elseif partId == 5
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
101 [lambda_vec, error_train, error_val] = ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
102 validationCurve(X, y, Xval, yval);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
103 out = sprintf('%0.5f ', ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
104 [lambda_vec(:); error_train(:); error_val(:)]);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
105 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
106 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
107
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
108 % ========================= SUBMIT HELPERS =========================
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
109
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
110 function src = source(partId)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
111 src = '';
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
112 src_files = sources();
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
113 if partId <= numel(src_files)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
114 flist = src_files{partId};
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
115 for i = 1:numel(flist)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
116 fid = fopen(flist{i});
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
117 while ~feof(fid)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
118 line = fgets(fid);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
119 src = [src line];
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
120 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
121 fclose(fid);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
122 src = [src '||||||||'];
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
123 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
124 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
125 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
126
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
127 function ret = isValidPartId(partId)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
128 partNames = validParts();
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
129 ret = (~isempty(partId)) && (partId >= 1) && (partId <= numel(partNames));
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
130 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
131
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
132 function partId = promptPart()
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
133 fprintf('== Select which part(s) to submit:\n', ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
134 homework_id());
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
135 partNames = validParts();
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
136 srcFiles = sources();
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
137 for i = 1:numel(partNames)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
138 fprintf('== %d) %s [', i, partNames{i});
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
139 fprintf(' %s ', srcFiles{i}{:});
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
140 fprintf(']\n');
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
141 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
142 fprintf('\nEnter your choice [1-%d]: ', ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
143 numel(partNames));
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
144 selPart = input('', 's');
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
145 partId = str2num(selPart);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
146 if ~isValidPartId(partId)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
147 partId = -1;
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
148 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
149 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
150
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
151
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
152 function [result, str] = submitSolution(email, part, output, source)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
153
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
154 result = ['a:5:{' ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
155 p_s('homework') p_s64(homework_id()) ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
156 p_s('part') p_s64(part) ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
157 p_s('email') p_s64(email) ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
158 p_s('output') p_s64(output) ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
159 p_s('source') p_s64(source) ...
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
160 '}'];
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
161
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
162 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
163
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
164 function s = p_s(str)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
165 s = ['s:' num2str(numel(str)) ':"' str '";'];
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
166 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
167
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
168 function s = p_s64(str)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
169 str = base64encode(str, '');
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
170 s = ['s:' num2str(numel(str)) ':"' str '";'];
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
171 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
172
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
173 % =========================== LOGIN HELPERS ===========================
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
174
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
175 function [login] = loginPrompt()
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
176 % Prompt for password
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
177 [login] = basicPrompt();
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
178 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
179
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
180
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
181 function [login] = basicPrompt()
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
182 login = input('Login (Email address): ', 's');
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
183 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
184
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
185
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
186 % =========================== Base64 Encoder ============================
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
187 % Thanks to Peter John Acklam
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
188 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
189
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
190 function y = base64encode(x, eol)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
191 %BASE64ENCODE Perform base64 encoding on a string.
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
192 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
193 % BASE64ENCODE(STR, EOL) encode the given string STR. EOL is the line ending
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
194 % sequence to use; it is optional and defaults to '\n' (ASCII decimal 10).
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
195 % The returned encoded string is broken into lines of no more than 76
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
196 % characters each, and each line will end with EOL unless it is empty. Let
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
197 % EOL be empty if you do not want the encoded string broken into lines.
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
198 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
199 % STR and EOL don't have to be strings (i.e., char arrays). The only
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
200 % requirement is that they are vectors containing values in the range 0-255.
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
201 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
202 % This function may be used to encode strings into the Base64 encoding
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
203 % specified in RFC 2045 - MIME (Multipurpose Internet Mail Extensions). The
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
204 % Base64 encoding is designed to represent arbitrary sequences of octets in a
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
205 % form that need not be humanly readable. A 65-character subset
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
206 % ([A-Za-z0-9+/=]) of US-ASCII is used, enabling 6 bits to be represented per
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
207 % printable character.
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
208 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
209 % Examples
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
210 % --------
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
211 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
212 % If you want to encode a large file, you should encode it in chunks that are
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
213 % a multiple of 57 bytes. This ensures that the base64 lines line up and
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
214 % that you do not end up with padding in the middle. 57 bytes of data fills
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
215 % one complete base64 line (76 == 57*4/3):
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
216 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
217 % If ifid and ofid are two file identifiers opened for reading and writing,
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
218 % respectively, then you can base64 encode the data with
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
219 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
220 % while ~feof(ifid)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
221 % fwrite(ofid, base64encode(fread(ifid, 60*57)));
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
222 % end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
223 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
224 % or, if you have enough memory,
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
225 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
226 % fwrite(ofid, base64encode(fread(ifid)));
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
227 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
228 % See also BASE64DECODE.
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
229
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
230 % Author: Peter John Acklam
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
231 % Time-stamp: 2004-02-03 21:36:56 +0100
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
232 % E-mail: pjacklam@online.no
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
233 % URL: http://home.online.no/~pjacklam
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
234
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
235 if isnumeric(x)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
236 x = num2str(x);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
237 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
238
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
239 % make sure we have the EOL value
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
240 if nargin < 2
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
241 eol = sprintf('\n');
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
242 else
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
243 if sum(size(eol) > 1) > 1
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
244 error('EOL must be a vector.');
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
245 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
246 if any(eol(:) > 255)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
247 error('EOL can not contain values larger than 255.');
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
248 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
249 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
250
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
251 if sum(size(x) > 1) > 1
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
252 error('STR must be a vector.');
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
253 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
254
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
255 x = uint8(x);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
256 eol = uint8(eol);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
257
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
258 ndbytes = length(x); % number of decoded bytes
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
259 nchunks = ceil(ndbytes / 3); % number of chunks/groups
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
260 nebytes = 4 * nchunks; % number of encoded bytes
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
261
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
262 % add padding if necessary, to make the length of x a multiple of 3
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
263 if rem(ndbytes, 3)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
264 x(end+1 : 3*nchunks) = 0;
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
265 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
266
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
267 x = reshape(x, [3, nchunks]); % reshape the data
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
268 y = repmat(uint8(0), 4, nchunks); % for the encoded data
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
269
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
270 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
271 % Split up every 3 bytes into 4 pieces
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
272 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
273 % aaaaaabb bbbbcccc ccdddddd
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
274 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
275 % to form
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
276 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
277 % 00aaaaaa 00bbbbbb 00cccccc 00dddddd
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
278 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
279 y(1,:) = bitshift(x(1,:), -2); % 6 highest bits of x(1,:)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
280
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
281 y(2,:) = bitshift(bitand(x(1,:), 3), 4); % 2 lowest bits of x(1,:)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
282 y(2,:) = bitor(y(2,:), bitshift(x(2,:), -4)); % 4 highest bits of x(2,:)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
283
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
284 y(3,:) = bitshift(bitand(x(2,:), 15), 2); % 4 lowest bits of x(2,:)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
285 y(3,:) = bitor(y(3,:), bitshift(x(3,:), -6)); % 2 highest bits of x(3,:)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
286
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
287 y(4,:) = bitand(x(3,:), 63); % 6 lowest bits of x(3,:)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
288
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
289 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
290 % Now perform the following mapping
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
291 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
292 % 0 - 25 -> A-Z
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
293 % 26 - 51 -> a-z
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
294 % 52 - 61 -> 0-9
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
295 % 62 -> +
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
296 % 63 -> /
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
297 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
298 % We could use a mapping vector like
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
299 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
300 % ['A':'Z', 'a':'z', '0':'9', '+/']
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
301 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
302 % but that would require an index vector of class double.
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
303 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
304 z = repmat(uint8(0), size(y));
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
305 i = y <= 25; z(i) = 'A' + double(y(i));
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
306 i = 26 <= y & y <= 51; z(i) = 'a' - 26 + double(y(i));
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
307 i = 52 <= y & y <= 61; z(i) = '0' - 52 + double(y(i));
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
308 i = y == 62; z(i) = '+';
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
309 i = y == 63; z(i) = '/';
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
310 y = z;
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
311
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
312 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
313 % Add padding if necessary.
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
314 %
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
315 npbytes = 3 * nchunks - ndbytes; % number of padding bytes
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
316 if npbytes
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
317 y(end-npbytes+1 : end) = '='; % '=' is used for padding
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
318 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
319
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
320 if isempty(eol)
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
321
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
322 % reshape to a row vector
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
323 y = reshape(y, [1, nebytes]);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
324
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
325 else
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
326
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
327 nlines = ceil(nebytes / 76); % number of lines
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
328 neolbytes = length(eol); % number of bytes in eol string
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
329
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
330 % pad data so it becomes a multiple of 76 elements
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
331 y = [y(:) ; zeros(76 * nlines - numel(y), 1)];
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
332 y(nebytes + 1 : 76 * nlines) = 0;
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
333 y = reshape(y, 76, nlines);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
334
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
335 % insert eol strings
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
336 eol = eol(:);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
337 y(end + 1 : end + neolbytes, :) = eol(:, ones(1, nlines));
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
338
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
339 % remove padding, but keep the last eol string
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
340 m = nebytes + neolbytes * (nlines - 1);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
341 n = (76+neolbytes)*nlines - neolbytes;
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
342 y(m+1 : n) = '';
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
343
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
344 % extract and reshape to row vector
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
345 y = reshape(y, 1, m+neolbytes);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
346
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
347 end
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
348
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
349 % output is a character array
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
350 y = char(y);
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
351
0f14514e907f initial commit
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
352 end