00001 
00002 
00003 
00004 
00008 
00009 #include "story.h"
00010 
00011 #ifndef TOOLBOX
00012 
00013 
00014 
00015 
00016 
00017 
00018 story::~story()
00019 {
00020     story * si = first_daughter_node;
00021     story * sn;
00022     while (si) {
00023         sn = si->next_story_node;
00024         delete si;
00025         si = sn;
00026     }
00027     if (text) {
00028 
00029         delete [] text;
00030     }
00031 }
00032 
00033 int  is_chapter(story * s)
00034 {
00035     if (s)
00036         return s->get_chapter_flag();
00037     else
00038         return 0;
00039 }
00040 
00041 int  is_chapter_begin_line(char * line)
00042 {
00043     return (*line == chapter_begin_char);
00044 }
00045 
00046 int  is_chapter_end_line(char * line)
00047 {
00048     return (*line == chapter_end_char);
00049 }
00050 
00051 int get_story_line(istream & str, char * line)
00052 {
00053     str.get(line,MAX_STORY_LINE_LENGTH,'\n');
00054 
00055     if(str.eof())
00056         return 0;
00057 
00058     char c;
00059     if(str.get(c) && c!='\n') {
00060         cerr << "get_story_line : input line too long :'"<<line<<"'\n";
00061         exit(1);
00062     }
00063 
00064     return 1;
00065 }
00066 
00067 void add_daughter_story(story * s, story * d)
00068 {
00069     if (!s || !d) return;
00070 
00071     story *fc = s->get_first_daughter_node();
00072     story *lc = s->get_last_daughter_node();
00073 
00074     
00075     
00076 
00077     if (fc == NULL && lc != NULL) {
00078         warning("add_daughter_story: repairing inconsistent story list");
00079         s->set_first_daughter_node(lc);
00080     }
00081 
00082     if (lc) {
00083         lc->set_next_story_node(d);
00084         s->set_last_daughter_node(d);
00085     } else {
00086         s->set_first_daughter_node(d);
00087         s->set_last_daughter_node(d);
00088     }
00089 }
00090 
00091 void add_chapter(story * s, story * chap)
00092 {
00093     if (!s || !chap) return;
00094 
00095     add_daughter_story(s, chap);
00096 }
00097 
00098 void rm_daughter_story(story * s, story * d)
00099 {
00100     if (!s || !d) return;
00101 
00102     story * fd = s->get_first_daughter_node();
00103     story * ad;                                    
00104     story * nd;                                    
00105 
00106     if (fd == d) {
00107         s->set_first_daughter_node(d->get_next_story_node());
00108 
00109         
00110 
00111         if (s->get_last_daughter_node() == d)
00112             s->set_last_daughter_node(NULL);
00113 
00114     } else
00115         {
00116         ad = fd;
00117         nd = ad->get_next_story_node();
00118         while (nd != d)
00119             {
00120             ad = nd;
00121             nd = ad->get_next_story_node();
00122             }
00123         nd = d->get_next_story_node();
00124         ad->set_next_story_node(nd);
00125         if (nd == NULL)
00126             s->set_last_daughter_node(ad);
00127         }
00128     delete d;    
00129 }
00130 
00131 story* mk_story_line()
00132 {
00133     story* s = new story(0);
00134     return s;
00135 }
00136 
00137 story* mk_story_line(char * line)
00138 {
00139     story* s = new story(0);
00140     s->set_text(line);
00141     return s;
00142 }
00143 
00144 story* mk_story_chapter()       {story* s = new story(1); return s;}
00145 
00146 story* mk_story_chapter(char * title)
00147 {
00148     story* s = new story(1);
00149     s->set_text(title);
00150     return s;
00151 }
00152 
00153 void add_story_line(story * s, char * line)
00154 {
00155     if (!s || !line) return;
00156 
00157     story * new_s = mk_story_line(line);
00158     add_daughter_story(s, new_s);
00159 }
00160 
00161 story* get_chapter(istream& str, char* line)
00162 {
00163     if (!is_chapter_begin_line(line)) {
00164         cerr << "get_chapter: first line not chapter_begin_line";
00165         exit(1);
00166     }
00167 
00168     story * chap = mk_story_chapter(++line);
00169 
00170     char new_line[MAX_STORY_LINE_LENGTH];
00171 
00172     while (get_story_line(str, new_line) && !is_chapter_end_line(new_line)) {
00173         if (is_chapter_begin_line(new_line))
00174             add_chapter(chap, get_chapter(str, new_line));
00175         else
00176             add_story_line(chap, new_line);
00177     }
00178 
00179     if (new_line == NULL) {
00180         cerr << "get_chapter: new_line == NULL before end of chapter\n";
00181         exit(1);
00182     }
00183 
00184     if (!streq(new_line+1, chap->get_text())) {
00185         cerr << "get_chapter: closing title ``" << new_line+1
00186              << "'' differs from opening title ``" << chap->get_text()
00187              << "''\n";
00188         exit(1);
00189     }
00190 
00191     return chap;
00192 }
00193 
00194 story* get_story(istream & str, char *line)  {return get_chapter(str, line);}
00195 
00196 story* get_story(istream& str)
00197 { 
00198     char line[MAX_STORY_LINE_LENGTH];
00199 
00200     if (!get_story_line(str, line))
00201         return(NULL);
00202 
00203     if (!is_chapter_begin_line(line))
00204         {
00205         cerr << "get_story: first line not chapter_begin_line\n";
00206         exit(1);
00207         }
00208 
00209     return get_chapter(str, line);
00210 }
00211 
00212 void put_headline(ostream& str, story& s)
00213 {
00214 #ifndef BAD_GNU_IO
00215     str << chapter_begin_char << s.get_text() << "\n";
00216 #else
00217     fprintf(stdout, "%c%s\n", chapter_begin_char, s.get_text());
00218 #endif
00219 }
00220 
00221 void put_tailline(ostream& str, story& s)
00222 {
00223 #ifndef BAD_GNU_IO
00224     str << chapter_end_char << s.get_text() << "\n";
00225 #else
00226     fprintf(stdout, "%c%s\n", chapter_end_char,s. get_text());
00227 #endif
00228 }
00229 
00230 void put_line_text(ostream& str, story& s)
00231 {
00232 #ifndef BAD_GNU_IO
00233     str << s.get_text() << "\n";
00234 #else
00235     fprintf(stdout, "%s\n", s.get_text());
00236 #endif
00237 }
00238 
00239 void put_chapter(ostream& str, story& s)
00240 {
00241     if (!is_chapter(&s))
00242         {
00243         cerr << "put_chapter: not a story\n";
00244         exit(1);
00245         }
00246     put_headline(str, s);
00247 
00248     for (story * d = s.get_first_daughter_node(); d != NULL;
00249                                                   d = d->get_next_story_node())
00250         {
00251         if (is_chapter(d))
00252             put_chapter(str, *d);
00253         else
00254             put_line_text(str, *d);
00255         }
00256     str << flush;
00257 
00258     put_tailline(str, s);
00259 }
00260 
00261 void put_story_contents(ostream& str, story& s)
00262 {
00263     if (!is_chapter(&s))
00264         {
00265         cerr << "put_story_contents: not a story\n";
00266         exit(1);
00267         }
00268 
00269     for (story * d = s.get_first_daughter_node(); d != NULL;
00270                                                   d = d->get_next_story_node())
00271         {
00272         if (is_chapter(d))
00273             put_chapter(str, *d);
00274         else
00275             put_line_text(str, *d);
00276         }
00277 }
00278 
00279 void put_story(ostream& str, story& s)
00280 {
00281     put_chapter(str, s);
00282 }
00283 
00284 
00285 
00286 
00287 
00288 
00289 
00290 
00291 
00292 
00293 
00294 
00295 
00296 
00297 
00298 
00299 
00300 #define  BYTE_LENGTH          8
00301 #define  SAFE_INT_LENGTH     (5 + (BYTE_LENGTH*sizeof(int))/3)
00302 #define  SAFE_REAL_LENGTH    (10 + (BYTE_LENGTH*sizeof(real))/3)
00303 #define  SAFE_STRING_LENGTH   1    
00304 #define  SAFE_VECTOR_LENGTH  (3 * (SAFE_REAL_LENGTH + 2))
00305 #define  EXTRA_LENGTH  5           
00306 
00307 
00308 
00309 
00310 
00311 local void  write_iq(story * a_story_line, char * name, int value)
00312 {
00313     if (!a_story_line || !name) return;
00314 
00315     char * new_string;
00316     int  new_string_length;
00317     
00318     new_string_length = EXTRA_LENGTH + strlen(name) + SAFE_INT_LENGTH;
00319     new_string  = new char[new_string_length];
00320 
00321     sprintf(new_string, "  %s = %d", name, value);
00322 
00323     a_story_line->set_text(new_string);
00324     delete [] new_string;
00325 }
00326 
00327 
00328 
00329 
00330 
00331 local void  write_ulq(story * a_story_line, char * name, unsigned long value)
00332 {
00333     if (!a_story_line || !name) return;
00334 
00335     char * new_string;
00336     int  new_string_length;
00337     
00338     new_string_length = EXTRA_LENGTH + strlen(name) + SAFE_INT_LENGTH;
00339     new_string  = new char[new_string_length];
00340 
00341     sprintf(new_string, "  %s = %lu", name, value);
00342 
00343     a_story_line->set_text(new_string);
00344     delete [] new_string;
00345 }
00346 
00347 
00348 
00349 
00350 
00351 local void  write_rq(story * a_story_line, char * name, real value, int p = 6)
00352 {
00353     if (!a_story_line || !name) return;
00354 
00355     char * new_string;
00356     int  new_string_length;
00357     char format[128];
00358     
00359     new_string_length = EXTRA_LENGTH + strlen(name) + SAFE_REAL_LENGTH;
00360     new_string  = new char[new_string_length];
00361 
00362     
00363 
00364     sprintf(format, "  %%s = %%.%dg", p);
00365 
00366     
00367     sprintf(new_string, format, name, value);           
00368 
00369     a_story_line->set_text(new_string);
00370     delete [] new_string;
00371 }
00372 
00373 
00374 
00375 
00376 
00377 local void  write_sq(story * a_story_line, char * name, char * value)
00378 {
00379     if (!a_story_line || !name) return;
00380 
00381     char * new_string;
00382     int  new_string_length;
00383     
00384     new_string_length = EXTRA_LENGTH + strlen(name)
00385                                      + strlen(value) + SAFE_STRING_LENGTH;
00386     new_string  = new char[new_string_length];
00387 
00388     sprintf(new_string, "  %s = %s", name, value);
00389 
00390     a_story_line->set_text(new_string);
00391     delete [] new_string;
00392 }
00393 
00394 
00395 
00396 
00397 
00398 local void  write_vq(story * a_story_line, char * name, vector & value)
00399 {
00400     if (!a_story_line || !name) return;
00401 
00402     char * new_string;
00403     int  new_string_length;
00404     
00405     new_string_length = EXTRA_LENGTH + strlen(name) + SAFE_VECTOR_LENGTH;
00406     new_string  = new char[new_string_length];
00407 
00408     sprintf(new_string, "  %s = %.6g %.6g %.6g", name,  
00409             value[0], value[1], value[2]);              
00410 
00411     a_story_line->set_text(new_string);
00412     delete [] new_string;
00413 }
00414 
00415 
00416 
00417 
00418 
00419 local void  write_ra(story * a_story_line, char * name, real * value, int n)
00420 {
00421     if (!a_story_line || !name) return;
00422 
00423     char *new_string, *tmp;
00424     int  new_string_length;
00425 
00426     new_string_length = EXTRA_LENGTH + strlen(name)
00427                                 + n * (SAFE_REAL_LENGTH + 2);
00428     new_string  = new char[new_string_length];
00429     tmp = new char[SAFE_REAL_LENGTH + 2];
00430 
00431     sprintf(new_string, "  %s =", name);
00432 
00433     for (int i = 0; i < n; i++) {
00434 
00435 
00436         sprintf(tmp, " %lf", value[i]);         
00437 
00438         strcat(new_string, tmp);
00439     }
00440 
00441     a_story_line->set_text(new_string);
00442     delete [] new_string;
00443     delete [] tmp;
00444 }
00445 
00446 
00447 
00448 
00449 
00450 local void  write_ia(story * a_story_line, char * name, int * value, int n)
00451 {
00452     if (!a_story_line || !name) return;
00453 
00454     char *new_string, *tmp;
00455     int  new_string_length;
00456 
00457     new_string_length = EXTRA_LENGTH + strlen(name)
00458                                 + n * (SAFE_INT_LENGTH + 2);
00459     new_string  = new char[new_string_length];
00460     tmp = new char[SAFE_INT_LENGTH + 2];
00461 
00462     sprintf(new_string, "  %s =", name);
00463 
00464     for (int i = 0; i < n; i++) {
00465 
00466         sprintf(tmp, " %d", value[i]);
00467 
00468         strcat(new_string, tmp);
00469     }
00470 
00471     a_story_line->set_text(new_string);
00472     delete [] new_string;
00473     delete [] tmp;
00474 }
00475 
00476 
00477 
00478 
00479 
00480 local void  write_ia(story * a_story_line, char * name,
00481                      unsigned long * value, int n)
00482 {
00483     if (!a_story_line || !name) return;
00484 
00485     char *new_string, *tmp;
00486     int  new_string_length;
00487 
00488     new_string_length = EXTRA_LENGTH + strlen(name)
00489                                 + n * (SAFE_INT_LENGTH + 2);
00490     new_string  = new char[new_string_length];
00491     tmp = new char[SAFE_INT_LENGTH + 2];
00492 
00493     sprintf(new_string, "  %s =", name);
00494 
00495     for (int i = 0; i < n; i++) {
00496 
00497         sprintf(tmp, " %d", value[i]);
00498 
00499         strcat(new_string, tmp);
00500     }
00501 
00502     a_story_line->set_text(new_string);
00503     delete [] new_string;
00504     delete [] tmp;
00505 }
00506 
00507 
00508 
00509 
00510 
00511 
00512 
00513 
00514 
00515 
00516 
00517 local bool qmatch(story * a_story_line, char * name)
00518 {
00519     if (!a_story_line || !name) return false;
00520 
00521     int  i, j;
00522     char *s;
00523 
00524     if ((s = a_story_line->get_text()) == NULL)
00525         return(FALSE);
00526     i = 0;
00527     while (s[i] == ' ')
00528         i++;
00529 
00530     j = 0;
00531     while (name[j] != '\0')
00532         {
00533         if (name[j] == ' ')
00534             j++;
00535         else 
00536             break;
00537         }
00538 
00539     while (name[j] != '\0')
00540         {
00541         if (s[i] != name[j])
00542             return(FALSE);
00543         i++;
00544         j++;
00545         }
00546 
00547     while (s[i] == ' ')
00548         i++;
00549 
00550     if (s[i] != '=')
00551         return(FALSE);
00552     if (s[++i] != ' ')
00553         return(FALSE);
00554 
00555     return(TRUE);
00556 }
00557 
00558 
00559 
00560 
00561 
00562 
00563 
00564 story * find_qmatch(story * a_story, char * name)
00565 {
00566     if (!a_story || !name) return NULL;
00567 
00568     story * a_chapter;
00569 
00570     a_chapter = a_story->get_first_daughter_node();
00571 
00572     while (a_chapter != NULL)
00573         {
00574         if (qmatch(a_chapter, name))
00575             return(a_chapter);
00576         else
00577             a_chapter = a_chapter->get_next_story_node();
00578         }
00579 
00580     return(NULL);
00581 }
00582 
00583 
00584 
00585 
00586 
00587 
00588 
00589 local char * get_qstring(story * a_story_line)
00590 {
00591     if (!a_story_line) return NULL;
00592 
00593     char *c;
00594     
00595     c = a_story_line->get_text();
00596     
00597     while (*(++c) != '=')
00598         ;
00599     while (*(++c) == ' ')
00600         ;
00601 
00602     return(c);
00603 }
00604 
00605 
00606 
00607 
00608 
00609 int getiq(story * a_story, char * name, bool verbose)
00610 {
00611     if (!a_story || !name) return 0;
00612 
00613     story * story_line;
00614 
00615     if ((story_line = find_qmatch(a_story, name)) == NULL)
00616         {
00617         if (verbose) cerr << "getiq: no quantity found with name \""
00618                           << name << "\"" << endl;
00619         return -VERY_LARGE_INTEGER;
00620         
00621         }
00622 
00623     return atoi(get_qstring(story_line));
00624 }
00625 
00626 
00627 
00628 
00629 
00630 unsigned long getulq(story *  a_story, char * name, bool verbose)
00631 {
00632     if (!a_story || !name) return 0;
00633 
00634     story * story_line;
00635     unsigned long l;
00636 
00637     if ((story_line = find_qmatch(a_story, name)) == NULL)
00638         {
00639         if (verbose) cerr << "getulq: no quantity found with name \""
00640                           << name << "\"" << endl;
00641         return 0;
00642         
00643         }
00644 
00645     return strtoul(get_qstring(story_line), (char**)NULL, 10);
00646 }
00647 
00648 
00649 
00650 
00651 
00652 real getrq(story * a_story, char * name, bool verbose)
00653 {
00654     if (!a_story || !name) return 0.0;
00655 
00656     story * story_line;
00657 
00658     if ((story_line = find_qmatch(a_story, name)) == NULL) {
00659 
00660         if (verbose) cerr << "getrq: no quantity found with name \""
00661                           << name << "\"" << endl;
00662         return -VERY_LARGE_NUMBER;
00663     }
00664 
00665     return atof(get_qstring(story_line));
00666 }
00667 
00668 
00669 
00670 
00671 
00672 
00673 
00674 
00675 
00676 
00677 
00678 
00679 char *getsq(story * a_story, char * name, bool verbose)
00680 {
00681     if (!a_story || !name) return NULL;
00682 
00683     story * story_line;
00684 
00685     if ((story_line = find_qmatch(a_story, name)) == NULL)
00686         {
00687         if (verbose) cerr << "getiq: no quantity found with name \""
00688                           << name << "\"" << endl;
00689         return (char*)NULL;
00690         
00691         }
00692 
00693     return get_qstring(story_line);
00694 }
00695 
00696 
00697 
00698 
00699 
00700 vector getvq(story *  a_story, char * name, bool verbose)
00701 {
00702     if (!a_story || !name) return vector(-VERY_LARGE_NUMBER,
00703                                               -VERY_LARGE_NUMBER,
00704                                               -VERY_LARGE_NUMBER);
00705 
00706     story * story_line;
00707 
00708     if ((story_line = find_qmatch(a_story, name)) == NULL) {
00709         if (verbose) cerr << "getiq: no quantity found with name \""
00710                           << name << "\"" << endl;
00711         return vector(-VERY_LARGE_NUMBER,
00712                       -VERY_LARGE_NUMBER,
00713                       -VERY_LARGE_NUMBER);
00714         
00715     }
00716 
00717     vector v;
00718     sscanf(get_qstring(story_line), "%lf %lf %lf", &v[0], &v[1], &v[2]);
00719 
00720     return v;
00721 }
00722 
00723 #define GET_ARR_BUFSIZ 8192
00724 
00725 static char s[GET_ARR_BUFSIZ];
00726 
00727 local void get_array(char * sin, real * x, int n)
00728 {
00729     
00730 
00731     
00732     
00733 
00734     
00735 
00736     
00737     
00738     
00739 
00740     
00741                                          
00742                                          
00743 
00744     if (n > GET_ARR_BUFSIZ)
00745         warning("get_array: truncating input string");
00746 
00747     strncpy(s, sin, GET_ARR_BUFSIZ);
00748 
00749     char *s1 = s, *s2 = s;
00750     int i = 0;
00751 
00752     while (*(s2++) > '\0') {
00753         if (*(s2-1) > ' ' && *s2 <= ' ') {
00754             char save = *s2;
00755 
00756             *s2 = '\0';
00757             x[i++] = atof(s1);
00758             *s2 = save;
00759 
00760             if (i >= n) break;
00761             s1 = s2;
00762         }
00763     }
00764 
00765     
00766 }
00767 
00768 local void get_array(char * sin, int * x, int n)        
00769 {
00770     
00771 
00772     if (n > GET_ARR_BUFSIZ)
00773         warning("get_array: truncating input string");
00774 
00775     strncpy(s, sin, GET_ARR_BUFSIZ);
00776 
00777     char *s1 = s, *s2 = s;
00778     int i = 0;
00779 
00780     while (*(s2++) > '\0') {
00781         if (*(s2-1) > ' ' && *s2 <= ' ') {
00782             char save = *s2;
00783 
00784             *s2 = '\0';
00785             x[i++] = atoi(s1);                          
00786             *s2 = save;
00787 
00788             if (i >= n) break;
00789             s1 = s2;
00790         }
00791     }
00792 }
00793 
00794 local void get_array(char * sin, unsigned long * x, int n)  
00795 {
00796     
00797 
00798     if (n > GET_ARR_BUFSIZ)
00799         warning("get_array: truncating input string");
00800 
00801     strncpy(s, sin, GET_ARR_BUFSIZ);
00802 
00803     char *s1 = s, *s2 = s;
00804     int i = 0;
00805 
00806     while (*(s2++) > '\0') {
00807         if (*(s2-1) > ' ' && *s2 <= ' ') {
00808             char save = *s2;
00809 
00810             *s2 = '\0';
00811             x[i++] = atoi(s1);                          
00812             *s2 = save;
00813 
00814             if (i >= n) break;
00815             s1 = s2;
00816         }
00817     }
00818 }
00819 
00820 
00821 
00822 
00823 
00824 void getra(story *  a_story, char * name, real * x, int n, bool verbose)
00825 {
00826     if (!a_story || !name) {
00827         *x = -VERY_LARGE_NUMBER;
00828         return;
00829     }
00830 
00831     story * story_line;
00832 
00833     if ((story_line = find_qmatch(a_story, name)) == NULL) {
00834 
00835         if (verbose) cerr << "getra: no quantity found with name \""
00836                           << name << "\"" << endl;
00837 
00838         *x = -VERY_LARGE_NUMBER;
00839         return;
00840 
00841     }
00842 
00843     get_array(get_qstring(story_line), x, n);
00844 }
00845 
00846 
00847 
00848 
00849 
00850 void getia(story *  a_story, char * name, int * x, int n, bool verbose)
00851 {
00852     if (!a_story || !name) {
00853         *x = -VERY_LARGE_INTEGER;
00854         return;
00855     }
00856 
00857     story * story_line;
00858 
00859     if ((story_line = find_qmatch(a_story, name)) == NULL) {
00860 
00861         if (verbose) cerr << "getia: no quantity found with name \""
00862                           << name << "\"" << endl;
00863 
00864         *x = -VERY_LARGE_INTEGER;
00865         return;
00866 
00867     }
00868 
00869     get_array(get_qstring(story_line), x, n);
00870 }
00871 
00872 
00873 
00874 
00875 
00876 void getia(story *  a_story, char * name, unsigned long * x,
00877            int n, bool verbose)
00878 {
00879     if (!a_story || !name) {
00880         *x = 0;
00881         return;
00882     }
00883 
00884     story * story_line;
00885 
00886     if ((story_line = find_qmatch(a_story, name)) == NULL) {
00887 
00888         if (verbose) cerr << "getia: no quantity found with name \""
00889                           << name << "\"" << endl;
00890 
00891         *x = 0;
00892         return;
00893 
00894     }
00895 
00896     get_array(get_qstring(story_line), x, n);
00897 }
00898 
00899 
00900 
00901 
00902 
00903 
00904 
00905 void putiq(story * a_story, char * name, int value)
00906 {
00907     if (!a_story || !name) return;
00908 
00909     story * story_line;
00910     
00911     if ((story_line = find_qmatch(a_story, name)) == NULL)
00912         {
00913         story_line = new story; 
00914         add_daughter_story(a_story, story_line);
00915         }
00916 
00917     write_iq(story_line, name, value);
00918 }
00919 
00920 
00921 
00922 
00923 
00924 
00925 
00926 void putulq(story * a_story, char * name, unsigned long value)
00927 {
00928     if (!a_story || !name) return;
00929 
00930     story * story_line;
00931     
00932     if ((story_line = find_qmatch(a_story, name)) == NULL)
00933         {
00934         story_line = new story; 
00935         add_daughter_story(a_story, story_line);
00936         }
00937 
00938     write_ulq(story_line, name, value);
00939 }
00940 
00941 
00942 
00943 
00944 void dump_story(story* s, int indent)
00945 {
00946     if (!s) return;
00947 
00948     if (indent == 0) cerr << endl;
00949 
00950     PRI(indent); cerr << "story s = " << s << endl;
00951     PRI(indent); cerr << "flag = " << s->get_chapter_flag() << endl;
00952     PRI(indent); cerr << "text:  \"" << s->get_text() << "\"" << endl;
00953     PRI(indent); cerr << "next = " << s->get_next_story_node() << endl;
00954     PRI(indent); cerr << "first = " << s->get_first_daughter_node() << endl;
00955     PRI(indent); cerr << "last = " << s->get_last_daughter_node() << endl;
00956 
00957     if (indent >= 0) {
00958         if (s->get_first_daughter_node())
00959             for (story* ss = s->get_first_daughter_node(); ss != NULL;
00960                  ss = ss->get_next_story_node())
00961                 dump_story(ss, indent+4);
00962     }
00963 }
00964 
00965 
00966 
00967 
00968 
00969 
00970 
00971 void putrq(story * a_story, char * name, real value, int precision)
00972 {
00973     if (!a_story || !name) return;
00974 
00975     story * story_line;
00976 
00977     bool dbg = false;
00978     if (name[0] == '-') {
00979         name++;
00980         dbg = true;
00981     }
00982 
00983     if (dbg) {
00984         cerr << endl << "in putrq..." << endl;
00985         dump_story(a_story);
00986     }
00987 
00988     if ((story_line = find_qmatch(a_story, name)) == NULL)
00989         {
00990 
00991         if (dbg) cerr << "making new story" << endl;
00992 
00993         story_line = new story; 
00994         add_daughter_story(a_story, story_line);
00995         }
00996 
00997 
00998     if (dbg) {
00999         dump_story(a_story);
01000         PRL(story_line);
01001     }
01002 
01003     write_rq(story_line, name, value, precision);
01004 
01005     if (dbg) {
01006         cerr << "wrote " << name << " = " << value << " to story" << endl;
01007         put_story(cerr, *a_story);
01008         PRL(story_line->get_text());
01009         PRL(get_qstring(story_line));
01010         dump_story(a_story);
01011     }
01012 }
01013 
01014 
01015 
01016 
01017 
01018 
01019 
01020 void putra(story * a_story, char * name, real * value, int n)
01021 {
01022     if (!a_story || !name) return;
01023 
01024     story * story_line;
01025     
01026     if ((story_line = find_qmatch(a_story, name)) == NULL)
01027         {
01028         story_line = new story; 
01029         add_daughter_story(a_story, story_line);
01030         }
01031 
01032     write_ra(story_line, name, value, n);
01033 }
01034 
01035 
01036 
01037 
01038 
01039 
01040 
01041 void putia(story * a_story, char * name, int * value, int n)
01042 {
01043     if (!a_story || !name) return;
01044 
01045     story * story_line;
01046     
01047     if ((story_line = find_qmatch(a_story, name)) == NULL)
01048         {
01049         story_line = new story; 
01050         add_daughter_story(a_story, story_line);
01051         }
01052 
01053     write_ia(story_line, name, value, n);
01054 }
01055 
01056 
01057 
01058 
01059 
01060 
01061 
01062 void putia(story * a_story, char * name, unsigned long * value, int n)
01063 {
01064     if (!a_story || !name) return;
01065 
01066     story * story_line;
01067     
01068     if ((story_line = find_qmatch(a_story, name)) == NULL)
01069         {
01070         story_line = new story; 
01071         add_daughter_story(a_story, story_line);
01072         }
01073 
01074     write_ia(story_line, name, value, n);
01075 }
01076 
01077 
01078 
01079 
01080 
01081 
01082 
01083 void putsq(story * a_story, char * name, char * value)
01084 {
01085     if (!a_story || !name) return;
01086 
01087     story * story_line;
01088     
01089     if ((story_line = find_qmatch(a_story, name)) == NULL)
01090         {
01091         story_line = new story; 
01092         add_daughter_story(a_story, story_line);
01093         }
01094 
01095     write_sq(story_line, name, value);
01096 }
01097 
01098 
01099 
01100 
01101 
01102 
01103 
01104 void putvq(story * a_story, char * name, vector & value)
01105 {
01106     if (!a_story || !name) return;
01107 
01108     story * story_line;
01109 
01110     if ((story_line = find_qmatch(a_story, name)) == NULL)
01111         {
01112         story_line = new story; 
01113         add_daughter_story(a_story, story_line);
01114         }
01115 
01116     write_vq(story_line, name, value);
01117 }
01118 
01119 
01120 
01121 
01122 
01123 
01124 
01125 int  rmq(story *  a_story, char * name)
01126 {
01127     if (!a_story || !name) return 0;
01128 
01129     story * story_line;
01130 
01131     if (story_line = find_qmatch(a_story, name))
01132         {
01133         rm_daughter_story(a_story, story_line);
01134         return 1;
01135         }
01136     else
01137         return 0;
01138 }
01139 
01140 
01141 
01142 
01143 
01144 
01145 
01146 
01147 int  is_quantity_name(story * a_story, char * name)
01148 {
01149     if (!a_story || !name) return 0;
01150 
01151     if (find_qmatch(a_story, name))
01152         return 1;
01153     else
01154         return 0;
01155 }
01156 
01157 
01158 #else
01159 
01160 main(int argc, char** argv)
01161     {
01162     story * s;
01163     check_help();
01164 
01165 
01166 
01167 
01168 
01169 
01170 
01171 
01172 
01173 
01174 
01175 
01176 
01177 
01178 
01179 
01180 
01181 
01182 
01183 
01184 
01185 
01186 
01187 
01188 
01189     }
01190 
01191 #endif