00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 #include "udanax.h"
00092
00100 static typesporglset *
00101 vspanset2sporglset(
00102 Session *sess,
00103 IStreamAddr *docisa,
00104 typevspanset vspanset,
00105 typesporglset *sporglsetptr,
00106 int type)
00107 {
00108 typeorgl orgl;
00109 typesporgl *sporglset;
00110 typeispanset ispanset;
00111
00112 ispanset = NULL;
00113 if (!findorgl(sess, granf, docisa, &orgl, type))
00114 return NULL;
00115
00116 for (; vspanset; vspanset = vspanset->next) {
00117 (void)vspanset2ispanset(sess, orgl, vspanset, &ispanset);
00118 for (; ispanset; ispanset = ispanset->next) {
00119 sporglset = new(sess) typesporgl;
00120 sporglset->itemid = SPORGLID;
00121 sporglset->next = NULL;
00122
00123 movetumbler(docisa, &sporglset->sporgladdress);
00124 movetumbler(&ispanset->stream, &sporglset->sporglorigin);
00125 movetumbler(&ispanset->width, &sporglset->sporglwidth);
00126
00127 *sporglsetptr = (typesporglset) sporglset;
00128 sporglsetptr = (typesporglset *) & sporglset->next;
00129 }
00130 }
00131
00132
00133 return sporglsetptr;
00134 }
00135
00143 bool
00144 specset2sporglset(
00145 Session *sess,
00146 typespecset specset,
00147 typesporglset *sporglsetptr,
00148 int type)
00149 {
00150 *sporglsetptr = NULL;
00151 for (; specset; specset = (typespecset) ((typeitemheader *) specset)->next) {
00152 if (((typeitemheader *) specset)->itemid == ISPANID) {
00153 *sporglsetptr = (typesporglset) specset;
00154 sporglsetptr = (typesporglset *) & ((typeitemheader *) specset)->next;
00155
00156 } else if (((typeitemheader *) specset)->itemid == VSPECID) {
00157
00158 if (!(sporglsetptr = vspanset2sporglset(sess, &((typevspec *) specset)->docisa, ((typevspec *) specset)->vspanset, sporglsetptr, type)))
00159 return false;
00160 }
00161 }
00162
00163 *sporglsetptr = NULL;
00164 return true;
00165 }
00166
00174 bool
00175 link2sporglset(
00176 Session *sess,
00177 IStreamAddr *linkisa,
00178 typesporglset *sporglsetptr,
00179 int whichend,
00180 int type)
00181 {
00182 typeorgl orgl;
00183 Tumbler zero;
00184 typevspan vspan;
00185 Context *context, *c;
00186 typesporgl *sporglptr;
00187
00188 if (!findorgl(sess, granf, linkisa, &orgl, type))
00189 return false;
00190
00191 tumblerclear(&zero);
00192 tumblerincrement(&zero, 0, whichend, &vspan.stream);
00193 tumblerincrement(&zero, 0 , 1, &vspan.width);
00194 if ((context = retrieverestricted((typecuc *) orgl, &vspan, V, (typespan *) NULL, I, (IStreamAddr *) NULL)) != 0) {
00195 for (c = context; c; c = (Context *) c->nextcontext) {
00196 sporglptr = new(sess) typesporgl;
00197 contextintosporgl((type2dcontext *) c, (Tumbler *) NULL, sporglptr, I);
00198
00199 *sporglsetptr = (typesporglset) sporglptr;
00200 sporglsetptr = (typesporglset *) & sporglptr->next;
00201 }
00202 contextfree(context);
00203 return true;
00204
00205 } else
00206 return false;
00207 }
00208
00216
00217
00218 static void
00219 sporglset2vspanset(
00220 Session *sess,
00221 IStreamAddr *homedoc,
00222 typesporglset *sporglsetptr,
00223 typevspanset *vspansetptr,
00224 int type)
00225 {
00226 typeorgl orgl;
00227 typeispan ispan;
00228
00229
00230 typesporgl *sporglptr;
00231
00232 sporglptr = (typesporgl *) * sporglsetptr;
00233
00234
00235 findorgl(sess, granf, homedoc , &orgl, type);
00236 ispan.itemid = ISPANID;
00237 ispan.next = NULL;
00238 movetumbler(&sporglptr->sporglorigin, &ispan.stream);
00239 movetumbler(&sporglptr->sporglwidth, &ispan.width);
00240 vspansetptr = ispan2vspanset(sess, orgl, &ispan, vspansetptr);
00241
00242 for (;;) {
00243 sporglptr = sporglptr->next;
00244 if (!sporglptr || !(sporglptr->itemid == SPORGLID) || !tumblereq(&((typesporgl *) sporglptr)->sporgladdress, &((typesporgl *) (*sporglsetptr))->sporgladdress))
00245 return;
00246
00247 *sporglsetptr = (typesporglset) sporglptr;
00248 movetumbler(&sporglptr->sporglorigin, &ispan.stream);
00249
00250 if (iszerotumbler(&sporglptr->sporglwidth))
00251 assert(0);
00252
00253 movetumbler(&sporglptr->sporglwidth, &ispan.width);
00254 vspansetptr = ispan2vspanset(sess, orgl, &ispan, vspansetptr);
00255 }
00256 }
00257
00265
00266
00267 static void
00268 linksporglset2vspec(
00269 Session *sess,
00270 IStreamAddr *homedoc,
00271 typesporglset *sporglsetptr,
00272 typevspec *specptr,
00273 int type)
00274 {
00275
00276 specptr->itemid = VSPECID;
00277 specptr->next = NULL;
00278 movetumbler(homedoc , &specptr->docisa);
00279
00280 specptr->vspanset = NULL;
00281 sporglset2vspanset(sess, homedoc, sporglsetptr, &specptr->vspanset, type);
00282 }
00283
00291 bool
00292 linksporglset2specset(
00293 Session *sess,
00294 IStreamAddr *homedoc,
00295 typesporglset sporglset,
00296 typespecset *specsetptr,
00297 int type)
00298 {
00299 typespecset specset;
00300
00301 *specsetptr = NULL;
00302 for (; sporglset; sporglset = (typesporglset) ((typeitemheader *) sporglset)->next) {
00303 specset = (typespecset) new(sess) typevspec;
00304
00305 if (iszerotumbler(&((typesporgl *) sporglset)->sporgladdress)) {
00306 if (iszerotumbler(&((typesporgl *) sporglset)->sporglwidth))
00307 assert(0);
00308
00309 ((typeitemheader *) specset)->itemid = ISPANID;
00310 movetumbler(&((typesporgl *) sporglset)->sporglorigin, &((typeispan *) specset)->stream);
00311 movetumbler(&((typesporgl *) sporglset)->sporglwidth, &((typeispan *) specset)->width);
00312 } else
00313 linksporglset2vspec(sess, homedoc, &sporglset, (typevspec *) specset, type);
00314
00315 ((typeitemheader *) specset)->next = NULL;
00316 *specsetptr = specset;
00317 specsetptr = (typespecset *) & ((typeitemheader *) specset)->next;
00318 }
00319 return true;
00320 }
00321
00329 void
00330 unpacksporgl(
00331 typesporglset sporglptr,
00332 Tumbler *streamptr,
00333 Tumbler *widthptr,
00334 type2dbottomcruminfo *infoptr)
00335 {
00336 if (((typeitemheader *) sporglptr)->itemid == ISPANID) {
00337 movetumbler(&((typeispan *) sporglptr)->stream, streamptr);
00338 movetumbler(&((typeispan *) sporglptr)->width, widthptr);
00339 tumblerclear(&infoptr->homedoc);
00340
00341 } else if (((typeitemheader *) sporglptr)->itemid == SPORGLID) {
00342 movetumbler(&((typesporgl *) sporglptr)->sporglorigin, streamptr);
00343 movetumbler(&((typesporgl *) sporglptr)->sporglwidth, widthptr);
00344 movetumbler(&((typesporgl *) sporglptr)->sporgladdress, &infoptr->homedoc );
00345
00346 } else
00347 L("unpacksporgl - bad itemid\n");
00348
00349 assert(!iszerotumbler(widthptr));
00350 }
00351
00359 void
00360 contextintosporgl(
00361 type2dcontext *context,
00362 Tumbler *linkid,
00363 typesporgl *sporglptr,
00364 int index)
00365 {
00366 sporglptr->itemid = SPORGLID;
00367 sporglptr->next = NULL;
00368 movetumbler( &context->context2dinfo.homedoc, &sporglptr->sporgladdress);
00369
00370
00371
00372 movetumbler(&context->totaloffset.dsas[index], &sporglptr->sporglorigin);
00373
00374 if (iszerotumbler(&context->contextwid.dsas[index]))
00375 assert(0);
00376
00377 movetumbler(&context->contextwid.dsas[index], &sporglptr->sporglwidth);
00378 }
00379
00387 static void
00388 sporglset2linksetinrange(
00389 Session *sess,
00390 typecuc *spanfptr,
00391 typesporglset sporglset,
00392 typelinkset *linksetptr,
00393 typeispan *orglrange,
00394 int spantype)
00395 {
00396 typespan range;
00397 Context *context, *c;
00398 IStreamAddr linksa;
00399
00400 type2dbottomcruminfo linfo;
00401 type2dbottomcruminfo *infoptr = &linfo;
00402 for (; sporglset; sporglset = (typesporglset) ((typeitemheader *) sporglset)->next) {
00403 if (false
00404 && ((typeitemheader *) sporglset)->itemid == SPORGLID) {
00405 infoptr = &linfo;
00406 movetumbler(&((typesporgl *) sporglset)->sporgladdress, &linfo.homedoc);
00407 } else
00408 infoptr = NULL;
00409
00410 if (orglrange) {
00411 prefixtumbler(&orglrange->stream, spantype, &range.stream);
00412 prefixtumbler(&orglrange->width, 0, &range.width);
00413 context = retrieverestricted(spanfptr, (typespan *) sporglset, SPANRANGE, &range, ORGLRANGE, (IStreamAddr *) infoptr);
00414 } else
00415 context = retrieverestricted(spanfptr, (typespan *) sporglset, SPANRANGE, (typespan *) NULL, ORGLRANGE, (IStreamAddr *) infoptr);
00416
00417 for (c = context; c; c = (Context *) c->nextcontext) {
00418 beheadtumbler(&c->totaloffset.dsas[ORGLRANGE], &linksa);
00419 onlinklist(sess, linksetptr, &linksa);
00420 }
00421
00422 contextfree(context);
00423 }
00424 }
00425
00433 void
00434 sporglset2linkset(
00435 Session *sess,
00436 typecuc *spanfptr,
00437 typesporglset sporglset,
00438 typelinkset *linksetptr,
00439 typeispan *homeset,
00440 int spantype)
00441 {
00442 typeispan nullhomeset;
00443
00444 *linksetptr = NULL;
00445
00446 if (true || !homeset) {
00447 tumblerclear(&nullhomeset.stream);
00448 tumblerclear(&nullhomeset.width);
00449 nullhomeset.width.mantissa[0] = 100;
00450 nullhomeset.next = NULL;
00451 homeset = &nullhomeset;
00452 }
00453
00454 for (; homeset; homeset = homeset->next)
00455 sporglset2linksetinrange(sess, spanfptr, sporglset, linksetptr, homeset, spantype);
00456 }