server/putfe.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: putfe.cxx,v $
00032  * Revision 1.16  2004/09/11 15:05:47  jrush
00033  * Some commenting.
00034  *
00035  * Revision 1.15  2004/09/11 15:02:00  jrush
00036  * Fixed Doxygen tags on all Session parameter arguments.
00037  *
00038  * Revision 1.14  2004/09/11 13:59:21  jrush
00039  * Changed all fprintf's to stderr to use the Nana library L() macro.  Also
00040  * removed a 2-3 minor compiler warnings.
00041  *
00042  * Revision 1.13  2004/09/04 16:02:18  jrush
00043  * Added Doxygen headers before each and every function definition.
00044  *
00045  * Revision 1.12  2002/07/26 04:33:47  jrush
00046  * Replaced gerror() with assert()
00047  *
00048  * Revision 1.11  2002/05/28 03:58:42  jrush
00049  * Sources modified to comply with GPL licensing.
00050  *
00051  * Revision 1.10  2002/04/12 11:48:51  jrush
00052  * Major reorganization of includes into a single base-include style.
00053  *
00054  * Revision 1.9  2002/04/10 18:01:54  jrush
00055  * Renamed class typeisa to IStreamAddr.
00056  *
00057  * Revision 1.8  2002/04/09 21:45:47  jrush
00058  * Renamed class 'tumbler' to 'Tumbler', for consistency with Python sources,
00059  * and changed typeisa from typedef to a subclass, in preparation for cleaning
00060  * up the type/class tree.
00061  *
00062  * Revision 1.7  2002/04/06 19:51:30  jrush
00063  * Renamed TRUE/FALSE constant use to the C++ standard of true/false.
00064  *
00065  * Revision 1.6  2002/04/06 17:05:57  jrush
00066  * Switched from referring to 'task' for a client connection to 'session',
00067  * and converted the typetask typedef/struct into a Session C++ class.
00068  *
00069  * Revision 1.5  2002/04/06 15:01:45  jrush
00070  * Changed INT to just 'int'.
00071  *
00072  * Revision 1.4  2002/02/14 10:08:25  jrush
00073  * Cleaned up source:
00074  *
00075  * 1. ran thru the indent tool to achieve a standard look,
00076  * 2. added structured comments at top for use with DOxygen reporting
00077  *    as well as CVS keywords,
00078  * 3. centralized prototypes in protos.h, removing incomplete ones,
00079  * 4. cleaned up use of bool/BOOLEAN type to suit C++ type,
00080  * 5. fixed initializer nesting in tumbler constants,
00081  * 6. converted select() int bits into ANSI fd_set type,
00082  * 7. added Makefile.am for use by automake.
00083  *
00084  */
00085 
00086 #include <string.h>
00087 #include "udanax.h"
00088 #include "requests.h"
00089 
00090 extern FILE *logfile;
00091 extern FILE *nulllog;
00092 extern FILE *reallog;
00093 
00094 FILE *febelog = NULL;
00095 bool firstputforrequest;
00096 
00097 #define WORDELIM '~'
00098 #define TUMDELIM '.'
00099 #define SPANFLAG 's'
00100 #define VSPECFLAG 'v'
00101 #define TEXTFLAG 't'
00102 #define FAILFLAG '?'
00103 
00104 void  puttextset(Session * sess, typetext ** textptrptr);
00105 void  putitem(Session * sess, typeitem * itemptr);
00106 void  putspan(Session * sess, typespan * spanptr);
00107 void  puttext(Session * sess, typetext * textptr);
00108 void  putspanpair(Session * sess, typespanpair * spanpair);
00109 void  frontenddied();
00110 
00111 /* #define xuputc(c,fd) putc ((c), (fd)) */
00112 
00120     void
00121 xuputc(
00122     char  c,
00123     FILE *fd)
00124 {
00125     if (putc(c, fd) == EOF) {
00126         perror("xuputc");
00127         frontenddied();
00128     } else if (febelog && febelog != nulllog) {
00129         if (firstputforrequest)
00130             fprintf(febelog, "\nbe:\n");
00131         firstputforrequest = false;
00132         putc(c, febelog);
00133     }
00134 
00135 }
00136 
00144     void
00145 xuputstring(
00146     char *string,
00147     FILE *fd)
00148 {
00149 /* while (*string) xuputc (*string++, fd); */
00150     fwrite(string, 1, strlen(string), fd);
00151 }
00152 
00160     void
00161 putnum(
00162     FILE *outfile,
00163     int   num)
00164 {
00165     char digits[32];
00166     int i;
00167 
00168     if (num == 0)
00169         xuputc('0', outfile);
00170     else {
00171         if (num < 0) {
00172             num = -num;
00173             xuputc('-', outfile);
00174         }
00175         for (i = 0; num != 0;) {
00176             digits[i++] = (char)(num % 10 + (int) '0');
00177             num /= 10;
00178         }
00179         while (i > 0)
00180             xuputc(digits[--i], outfile);
00181     }
00182 }
00183 
00191     void
00192 sendresultoutput(
00193     Session *session)    
00194 {
00195 /* FILE *fd; fd = session->outp; write (fd->_file, fd->_base, (int) (fd->_ptr - fd->_base)); fd->_ptr = fd->_base;
00196  * fd->_cnt = BUFSIZ; */
00197     fflush(session->outp);
00198 }
00199 
00207     void
00208 error(
00209     Session *session,    
00210     char    *string)
00211 {
00212     xuputstring(string, session->errp);
00213 }
00214 
00222     void
00223 prompt(
00224     Session *session,    
00225     char    *string)
00226 {
00227     xuputstring(string, session->outp);
00228 }
00229 
00237     void
00238 putnumber(
00239     FILE *outfile,
00240     int   num)
00241 {
00242     putnum(outfile, num);
00243     xuputc(WORDELIM, outfile);
00244 }
00245 
00253     void
00254 puttumbler(
00255     FILE    *outfile,
00256     Tumbler *tumblerptr)
00257 {
00258     int i, place;
00259 
00260     putnum(outfile, -tumblerptr->exp);
00261     place = NPLACES;
00262     do {
00263         --place;
00264     } while (place > 0 && tumblerptr->mantissa[place] == 0);
00265     for (i = 0; i <= place; ++i) {
00266         xuputc(TUMDELIM, outfile);
00267         putnum(outfile, (int) tumblerptr->mantissa[i]);
00268     }
00269     xuputc(WORDELIM, outfile);
00270 }
00271 
00279     void
00280 putisa(
00281     Session     *session,    
00282     IStreamAddr *isaptr)
00283 {
00284     puttumbler(session->outp, isaptr);
00285 }
00286 
00294     void
00295 putitemset(
00296     Session     *session,    
00297     typeitemset  itemset)
00298 {
00299     int i;
00300     typeitemset temp;
00301 
00302     for (temp = itemset, i = 0; temp; temp = (typeitemset) ((typeitemheader *) temp)->next, ++i) {
00303         while (((typeitemheader *) temp)->itemid == TEXTID && ((typeitemheader *) temp)->next
00304                && ((typeitemheader *) temp)->next->itemid == TEXTID)
00305             temp = (typeitemset) ((typeitemheader *) temp)->next;       /* count lots of textitems as one item */
00306     }
00307     putnumber(session->outp, i);
00308 /* fprintf (session->errp, "X putitemset nitems is %d\n", i); */
00309     for (; itemset; itemset = (typeitemset) ((typeitemheader *) itemset)->next) {
00310         if (((typeitemheader *) itemset)->itemid == TEXTID)
00311             puttextset(session, (typetext **) & itemset);
00312         else
00313             putitem(session, itemset);
00314     }
00315 }
00316 
00324     void
00325 putitem(
00326     Session  *session,    
00327     typeitem *itemptr)
00328 {
00329     FILE *outfile;
00330 
00331     outfile = session->outp;
00332     switch (((typeitemheader *) itemptr)->itemid) {
00333     case ISPANID:
00334         xuputc(SPANFLAG, outfile);
00335         xuputc(WORDELIM, outfile);
00336         putspan(session, (typespan *) itemptr);
00337         break;
00338     case VSPANID:
00339         putspan(session, (typespan *) itemptr);
00340         break;
00341     case VSPECID:
00342         xuputc(VSPECFLAG, outfile);
00343         xuputc(WORDELIM, outfile);
00344         puttumbler(outfile, &((typevspec *) itemptr)->docisa);
00345         putitemset(session, (typeitemset) ((typevspec *) itemptr)->vspanset);
00346         break;
00347     case TEXTID:
00348 /* fprintf (session->errp, "X put text %d characters\n",itemptr->length); */
00349         puttext(session, (typetext *) itemptr);
00350         break;
00351     case ADDRESSID:
00352 /* 
00353  * fprintf (session->errp, "X put address "); puttumbler (session->errp,
00354  * &itemptr->address); fprintf(session->errp, "\n"); */
00355         puttumbler(outfile, &((typeaddress *) itemptr)->address);
00356         break;
00357 
00358     default:
00359         error(session, "illegal item id for senditem");
00360         return;
00361     }
00362 }
00363 
00371     void
00372 putspan(
00373     Session  *session,    
00374     typespan *spanptr)
00375 {
00376     fprintf(logfile, "putspan\n");
00377     puttumbler(session->outp, &spanptr->stream);
00378     puttumbler(session->outp, &spanptr->width);
00379 }
00380 
00388     void
00389 puttextset(
00390     Session   *session,    
00391     typetext **textptrptr)
00392 {
00393     typetext *textptr, *last;
00394     int i;
00395 
00396     for (i = 0, textptr = *textptrptr; textptr && textptr->itemid == TEXTID; textptr = textptr->next) {
00397         i += textptr->length;
00398     }
00399     xuputc(TEXTFLAG, session->outp);
00400     putnumber(session->outp, i);
00401     last = NULL;
00402     for (textptr = *textptrptr; textptr && textptr->itemid == TEXTID; textptr = textptr->next) {
00403         for (i = 0; i < textptr->length; ++i)
00404             xuputc(textptr->string[i], session->outp);
00405         last = textptr;
00406     }
00407     *textptrptr = last;
00408 }
00409 
00417     void
00418 puttext(
00419     Session  *session,    
00420     typetext *textptr)
00421 {
00422     int i;
00423 
00424     fprintf(logfile, "puttext\n");
00425 /* fprintf (session->errp, "X puttext %d characters\n", textptr->length); */
00426     xuputc(TEXTFLAG, session->outp);
00427     putnumber(session->outp, textptr->length);
00428 
00429 /* write (fileno(session->outp), textptr->string, textptr->length); */
00430     for (i = 0; i < textptr->length; ++i)
00431         xuputc(textptr->string[i], session->outp);
00432 }
00433 
00441     void
00442 putspanpairset(
00443     Session         *session,    
00444     typespanpairset  spanpairset)
00445 {
00446     typespanpair *ptr;
00447     int n;
00448 
00449     for (n = 0, ptr = spanpairset; ptr; ++n, ptr = ptr->nextspanpair) ;
00450     putnumber(session->outp, n);
00451     for (; spanpairset; spanpairset = spanpairset->nextspanpair)
00452         putspanpair(session, spanpairset);
00453 }
00454 
00462     void
00463 putspanpair(
00464     Session      *session,    
00465     typespanpair *spanpair)
00466 {
00467     puttumbler(session->outp, &spanpair->stream1);
00468     puttumbler(session->outp, &spanpair->stream2);
00469     puttumbler(session->outp, &spanpair->widthofspan);
00470 }
00471 
00472 /* ---------------- top level put routines --------------- */
00473 
00481     void
00482 putinsert(
00483     Session *session)    
00484 {
00485     putnumber(session->outp, INSERT); // Echo request code
00486 }
00487 
00495     void
00496 putretrievedocvspanset(
00497     Session     *session,    
00498     typespanset *spansetptr)
00499 {
00500     putnumber(session->outp, RETRIEVEDOCVSPANSET); // Echo request code
00501     putitemset(session, (typeitemset) * spansetptr);
00502 }
00503 
00511     void
00512 putcopy(
00513     Session *session)    
00514 {
00515     putnumber(session->outp, COPY); // Echo request code
00516 }
00517 
00525     void
00526 putrearrange(
00527     Session *session)    
00528 {
00529     putnumber(session->outp, REARRANGE); // Echo request code
00530 }
00531 
00539     void
00540 putcreatelink(
00541     Session     *session,    
00542     IStreamAddr *istreamptr)
00543 {
00544     putnumber(session->outp, CREATELINK); // Echo request code
00545     putisa(session, istreamptr);
00546 }
00547 
00555     void
00556 putretrievev(
00557     Session       *session,    
00558     typevstuffset *vstuffsetptr)
00559 {
00560 /* fprintf (session->errp, "X putretrievev\n"); */
00561     putnumber(session->outp, RETRIEVEV); // Echo request code
00562     putitemset(session, (typeitemset) * vstuffsetptr);
00563 }
00564 
00572     void
00573 putfindnumoflinksfromtothree(
00574     Session *session,    
00575     int      num)
00576 {
00577     putnumber(session->outp, FINDNUMOFLINKSFROMTOTHREE); // Echo request code
00578     putnumber(session->outp, num);
00579 }
00580 
00588     void
00589 putfindlinksfromtothree(
00590     Session     *session,    
00591     typelinkset  linkset)
00592 {
00593     fprintf(logfile, "putfindlinksfromtothree\n");
00594     putnumber(session->outp, FINDLINKSFROMTOTHREE); // Echo request code
00595     putitemset(session, (typeitemset) linkset);
00596 }
00597 
00605     void
00606 putfindnextnlinksfromtothree(
00607     Session     *session,    
00608     int          n,
00609     typelinkset  nextlinkset)
00610 {
00611 /* fprintf (session->errp, "X putfindnextnlinksfromtothree\n"); */
00612     putnumber(session->outp, FINDNEXTNLINKSFROMTOTHREE); // Echo request code
00613     putitemset(session, (typeitemset) nextlinkset);
00614 }
00615 
00616 /* historical trace */
00617 
00625     void
00626 putshowrelationof2versions(
00627     Session         *session,    
00628     typespanpairset  relation)
00629 {
00630     putnumber(session->outp, SHOWRELATIONOF2VERSIONS); // Echo request code
00631     putspanpairset(session, relation);
00632 }
00633 
00641     void
00642 putcreatenewdocument(
00643     Session     *session,    
00644     IStreamAddr *newdocisaptr)
00645 {
00646 /* 
00647  * fprintf (session->errp, "X new document created "); puttumbler
00648  * (session->errp, newdocisaptr); fprintf (session->errp, "\n"); */
00649     putnumber(session->outp, CREATENEWDOCUMENT); // Echo request code
00650     putisa(session, newdocisaptr);
00651 }
00652 
00660     void
00661 putdeletevspan(
00662     Session *session)    
00663 {
00664     putnumber(session->outp, DELETEVSPAN); // Echo request code
00665 }
00666 
00674     void
00675 putcreatenewversion(
00676     Session     *session,    
00677     IStreamAddr *newdocisaptr)
00678 {
00679     putnumber(session->outp, CREATENEWVERSION); // Echo request code
00680     putisa(session, newdocisaptr);
00681 }
00682 
00690     void
00691 putretrievedocvspan(
00692     Session  *session,    
00693     typespan *vspanptr)
00694 {
00695     putnumber(session->outp, RETRIEVEDOCVSPAN); // Echo request code
00696     putspan(session, vspanptr);
00697 }
00698 
00699 /* set debug */
00700 
00701 /* disk exit */
00702 
00703 /* show enfilades */
00704 
00712     void
00713 putfollowlink(
00714     Session     *session,    
00715     typespecset  specset)
00716 {
00717     putnumber(session->outp, FOLLOWLINK); // Echo request code
00718     putitemset(session, (typeitemset) specset);
00719 }
00720 
00721 /* examine */
00722 
00723 /* source unix command */
00724 
00732     void
00733 putfinddocscontaining(
00734     Session     *session,    
00735     typeitemset  addressset)
00736 {
00737 /* fprintf (session->errp, "X putfinddocscontaining\n"); */
00738     putnumber(session->outp, FINDDOCSCONTAINING); // Echo request code
00739     putitemset(session, addressset);
00740 }
00741 
00749     void
00750 putretrieveendsets(
00751     Session     *session,    
00752     typespecset  fromset,
00753     typespecset  toset,
00754     typespecset  threeset)
00755 {
00756     putnumber(session->outp, RETRIEVEENDSETS); // Echo request code
00757     putitemset(session, (typeitemset) fromset);
00758     putitemset(session, (typeitemset) toset);
00759     putitemset(session, (typeitemset) threeset);
00760 }
00761 
00769     void
00770 putrequestfailed(
00771     Session *session)    
00772 {
00773     //assert(0); // putrequestfailed
00774     xuputc(FAILFLAG, session->outp);
00775 }
00776 
00784     void
00785 putxaccount(
00786     Session *session)    
00787 {
00788     putnumber(session->outp, XACCOUNT); // Echo request code
00789 }
00790 
00798     void
00799 putcreatenode_or_account(
00800     Session *session,    
00801     Tumbler *tp)
00802 {
00803     putnumber(session->outp, CREATENODE_OR_ACCOUNT); // Echo request code
00804     puttumbler(session->outp, tp);
00805 }
00806 
00814     void
00815 putopen(
00816     Session *session,    
00817     Tumbler *tp)
00818 {
00819     putnumber(session->outp, OPEN); // Echo request code
00820     puttumbler(session->outp, tp);
00821 }
00822 
00830     void
00831 putclose(
00832     Session *session)    
00833 {
00834     putnumber(session->outp, CLOSE); // Echo request code
00835 }
00836 
00844     void
00845 putquitxanadu(
00846     Session *session)    
00847 {
00848     putnumber(session->outp, QUIT); // Echo request code
00849 }

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