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 #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
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
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
00196
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;
00306 }
00307 putnumber(session->outp, i);
00308
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
00349 puttext(session, (typetext *) itemptr);
00350 break;
00351 case ADDRESSID:
00352
00353
00354
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
00426 xuputc(TEXTFLAG, session->outp);
00427 putnumber(session->outp, textptr->length);
00428
00429
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
00473
00481 void
00482 putinsert(
00483 Session *session)
00484 {
00485 putnumber(session->outp, INSERT);
00486 }
00487
00495 void
00496 putretrievedocvspanset(
00497 Session *session,
00498 typespanset *spansetptr)
00499 {
00500 putnumber(session->outp, RETRIEVEDOCVSPANSET);
00501 putitemset(session, (typeitemset) * spansetptr);
00502 }
00503
00511 void
00512 putcopy(
00513 Session *session)
00514 {
00515 putnumber(session->outp, COPY);
00516 }
00517
00525 void
00526 putrearrange(
00527 Session *session)
00528 {
00529 putnumber(session->outp, REARRANGE);
00530 }
00531
00539 void
00540 putcreatelink(
00541 Session *session,
00542 IStreamAddr *istreamptr)
00543 {
00544 putnumber(session->outp, CREATELINK);
00545 putisa(session, istreamptr);
00546 }
00547
00555 void
00556 putretrievev(
00557 Session *session,
00558 typevstuffset *vstuffsetptr)
00559 {
00560
00561 putnumber(session->outp, RETRIEVEV);
00562 putitemset(session, (typeitemset) * vstuffsetptr);
00563 }
00564
00572 void
00573 putfindnumoflinksfromtothree(
00574 Session *session,
00575 int num)
00576 {
00577 putnumber(session->outp, FINDNUMOFLINKSFROMTOTHREE);
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);
00595 putitemset(session, (typeitemset) linkset);
00596 }
00597
00605 void
00606 putfindnextnlinksfromtothree(
00607 Session *session,
00608 int n,
00609 typelinkset nextlinkset)
00610 {
00611
00612 putnumber(session->outp, FINDNEXTNLINKSFROMTOTHREE);
00613 putitemset(session, (typeitemset) nextlinkset);
00614 }
00615
00616
00617
00625 void
00626 putshowrelationof2versions(
00627 Session *session,
00628 typespanpairset relation)
00629 {
00630 putnumber(session->outp, SHOWRELATIONOF2VERSIONS);
00631 putspanpairset(session, relation);
00632 }
00633
00641 void
00642 putcreatenewdocument(
00643 Session *session,
00644 IStreamAddr *newdocisaptr)
00645 {
00646
00647
00648
00649 putnumber(session->outp, CREATENEWDOCUMENT);
00650 putisa(session, newdocisaptr);
00651 }
00652
00660 void
00661 putdeletevspan(
00662 Session *session)
00663 {
00664 putnumber(session->outp, DELETEVSPAN);
00665 }
00666
00674 void
00675 putcreatenewversion(
00676 Session *session,
00677 IStreamAddr *newdocisaptr)
00678 {
00679 putnumber(session->outp, CREATENEWVERSION);
00680 putisa(session, newdocisaptr);
00681 }
00682
00690 void
00691 putretrievedocvspan(
00692 Session *session,
00693 typespan *vspanptr)
00694 {
00695 putnumber(session->outp, RETRIEVEDOCVSPAN);
00696 putspan(session, vspanptr);
00697 }
00698
00699
00700
00701
00702
00703
00704
00712 void
00713 putfollowlink(
00714 Session *session,
00715 typespecset specset)
00716 {
00717 putnumber(session->outp, FOLLOWLINK);
00718 putitemset(session, (typeitemset) specset);
00719 }
00720
00721
00722
00723
00724
00732 void
00733 putfinddocscontaining(
00734 Session *session,
00735 typeitemset addressset)
00736 {
00737
00738 putnumber(session->outp, FINDDOCSCONTAINING);
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);
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
00774 xuputc(FAILFLAG, session->outp);
00775 }
00776
00784 void
00785 putxaccount(
00786 Session *session)
00787 {
00788 putnumber(session->outp, XACCOUNT);
00789 }
00790
00798 void
00799 putcreatenode_or_account(
00800 Session *session,
00801 Tumbler *tp)
00802 {
00803 putnumber(session->outp, CREATENODE_OR_ACCOUNT);
00804 puttumbler(session->outp, tp);
00805 }
00806
00814 void
00815 putopen(
00816 Session *session,
00817 Tumbler *tp)
00818 {
00819 putnumber(session->outp, OPEN);
00820 puttumbler(session->outp, tp);
00821 }
00822
00830 void
00831 putclose(
00832 Session *session)
00833 {
00834 putnumber(session->outp, CLOSE);
00835 }
00836
00844 void
00845 putquitxanadu(
00846 Session *session)
00847 {
00848 putnumber(session->outp, QUIT);
00849 }