libsrc/sporgl.cxx

Go to the documentation of this file.
00001 /**********************************************************************
00002  * Copyright 2002 Jeff Rush <jrush@taupro.com>
00003  * Original Copyright 1979-2002 Udanax.com
00004  *
00005  * This file is part of the Udanax xanalogical storage system.
00006  *
00007  * Udanax is free software; you can redistribute it and/or modify it
00008  * under the terms of the GNU General Public License as published by
00009  * the Free Software Foundation; either version 2 of the License, or
00010  * (at your option) any later version.
00011  *
00012  * Udanax is distributed in the hope that it will be useful, but
00013  * WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  * GNU General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU General Public License
00018  * along with Udanax; if not, write to the Free Software Foundation,
00019  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00020  **********************************************************************/
00021 
00030 /* Modification History:
00031  * $Log: sporgl.cxx,v $
00032  * Revision 1.14  2004/09/11 13:59:21  jrush
00033  * Changed all fprintf's to stderr to use the Nana library L() macro.  Also
00034  * removed a 2-3 minor compiler warnings.
00035  *
00036  * Revision 1.13  2004/09/04 16:02:18  jrush
00037  * Added Doxygen headers before each and every function definition.
00038  *
00039  * Revision 1.12  2002/07/14 08:35:23  jrush
00040  * Replace gerror(), qerror() with assert()
00041  *
00042  * Revision 1.11  2002/05/28 04:22:29  jrush
00043  * Adjusted source files to comply with GPL licensing.
00044  *
00045  * Revision 1.10  2002/05/28 02:52:23  jrush
00046  * Made static any functions and global variables private to this source file
00047  * and commented out any unused functions.
00048  *
00049  * Revision 1.9  2002/04/12 11:56:43  jrush
00050  * Reorganized include file layout, renamed xanadu.h to udanax.h and
00051  * typecontext/typecrumcontext to C++ class Context/CrumContext.
00052  *
00053  * Revision 1.8  2002/04/10 18:01:54  jrush
00054  * Renamed class typeisa to IStreamAddr.
00055  *
00056  * Revision 1.7  2002/04/09 21:45:46  jrush
00057  * Renamed class 'tumbler' to 'Tumbler', for consistency with Python sources,
00058  * and changed typeisa from typedef to a subclass, in preparation for cleaning
00059  * up the type/class tree.
00060  *
00061  * Revision 1.6  2002/04/06 20:42:50  jrush
00062  * Switch from sess->alloc() style to new(sess) Object parameterized allocator.
00063  *
00064  * Revision 1.5  2002/04/06 19:51:30  jrush
00065  * Renamed TRUE/FALSE constant use to the C++ standard of true/false.
00066  *
00067  * Revision 1.4  2002/04/06 17:05:57  jrush
00068  * Switched from referring to 'task' for a client connection to 'session',
00069  * and converted the typetask typedef/struct into a Session C++ class.
00070  *
00071  * Revision 1.3  2002/04/06 15:01:17  jrush
00072  * Changed INT to just 'int'.
00073  *
00074  * Revision 1.2  2002/02/14 09:27:43  jrush
00075  * Cleaned up source:
00076  *
00077  * 1. ran thru the indent tool to achieve a standard look,
00078  * 2. added structured comments at top for use with DOxygen reporting
00079  *    as well as CVS keywords,
00080  * 3. fixed compiler warnings re ambiguous assign/compares,
00081  *    needed casts and unused/uninitialized variables,
00082  * 4. fixed funcs that didn't specify a return type,
00083  * 5. centralized prototypes in protos.h, removing incomplete ones,
00084  * 6. cleaned up use of bool/BOOLEAN type to suit C++ type,
00085  * 7. fixed initializer nesting in tumbler constants,
00086  * 8. renamed vars that conflict with C++ keywords (new, this),
00087  * 9. fixed global/extern confusion re some global vars.
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 /* note that this returns the LAST sporgl alloced this is ok the returned value gets passed back to here to be used for 
00132  * a linked list */
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 */ , 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 /* leaves sporglsetptr on last sporgl processed, NOT next to be processed */
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 /* Tumbler zero; */
00230     typesporgl *sporglptr;
00231 
00232     sporglptr = (typesporgl *) * sporglsetptr;
00233 /* tumblerclear (&zero); */
00234 
00235     findorgl(sess, granf, homedoc /* &sporglptr->sporgladdress */, &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); // 2 sporgl ispan width 0 in sporglset2vspanset
00252 
00253         movetumbler(&sporglptr->sporglwidth, &ispan.width);
00254         vspansetptr = ispan2vspanset(sess, orgl, &ispan, vspansetptr);
00255     }
00256 }
00257 
00265 /* leaves sporglsetptr on last sporgl processed, NOT next to be processed */
00266 
00267     static void
00268 linksporglset2vspec(
00269     Session       *sess,          
00270     IStreamAddr   *homedoc,
00271     typesporglset *sporglsetptr,
00272     typevspec     *specptr,
00273     int            type)
00274 {
00275 /* typesporglset sporglset; sporglset = *sporglsetptr; */
00276     specptr->itemid = VSPECID;
00277     specptr->next   = NULL;
00278     movetumbler(homedoc /* &sporglset->sporgladdress */ , &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 //        specset = (typespecset) sess->alloc(sizeof(typevspec));
00305         if (iszerotumbler(&((typesporgl *) sporglset)->sporgladdress)) {
00306             if (iszerotumbler(&((typesporgl *) sporglset)->sporglwidth))
00307                 assert(0); // zero wid I span in linksporglset2specset
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 /* should be sourcedoc */ );
00345 
00346     } else
00347         L("unpacksporgl - bad itemid\n");
00348 
00349     assert(!iszerotumbler(widthptr));  // ERROR: zero width in unpacksporgl
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(/* linkid */ &context->context2dinfo.homedoc, &sporglptr->sporgladdress);
00369 
00370 /* ^^^^^ zzz foo kluge 11/23/84 ^^^^^ */
00371 
00372     movetumbler(&context->totaloffset.dsas[index], &sporglptr->sporglorigin);
00373 
00374     if (iszerotumbler(&context->contextwid.dsas[index]))
00375         assert(0); // zero wid in contextintosporgl
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 /* trying to kluge links followable thru versions */
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 }

Generated on Sun Aug 21 04:18:14 2005 for Udanax-Green by doxygen1.3.4