147{
148 Int offset, j0, j1, templatewidth0, templatewidth1, nbcol0, nbcol1;
150 assert(type == 'c' || type == 'r');
151 nbcol0 = (type ==
'c' ? ma->
nbcol : ma->
nbrow);
152 nbcol1 = (type ==
'c' ? mb->
nbcol : mb->
nbrow);
153 templatewidth0 = q0 * nbcol0;
154 templatewidth1 = q1 * nbcol1;
155 {
158 j0 =
SHIFT(col0, sp0, q0) * nbcol0 - ja;
159 j1 =
SHIFT(col1, sp1, q1) * nbcol1 - jb;
160 }
161 offset = 0;
162 l = 0;
163
164
165
166 assert(j0 + nbcol0 > 0);
167 assert(j1 + nbcol1 > 0);
168 while ((j0 < n) && (j1 < n)) {
171 end0 = j0 + nbcol0;
172 end1 = j1 + nbcol1;
173 if (end0 <= j1) {
174 j0 += templatewidth0;
175 l += nbcol0;
176 continue;
177 }
178 if (end1 <= j0) {
179 j1 += templatewidth1;
180 continue;
181 }
182
184 start =
max(start, 0);
185
186 result[offset].
lstart = l + start - j0;
187 end =
min(end0, end1);
188 if (end0 == end) {
189 j0 += templatewidth0;
190 l += nbcol0;
191 }
192 if (end1 == end)
193 j1 += templatewidth1;
194
196 assert(end > start);
197
198
199
200
201
202
203 result[offset].
len = end - start;
204 offset += 1;
205 }
206 return offset;
207}
#define SHIFT(row, sprow, nbrow)