00001
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include <ctype.h>
00040 #include <stdlib.h>
00041 #include <stdio.h>
00042 #include <string.h>
00043 #include "buf.h"
00044 #include "forms.h"
00045
00047 #define LONGEST_KEY 256
00048
00050 void frm_clear(Form *frm);
00051
00053 void frm_define_field(Form *frm, char *nm, char *val);
00054
00056 void frm_print(Form *frm);
00057
00063 FormField *fld_add(FormField *fld, char *nm) {
00064 FormField *fnew = NULL;
00065
00066 if (! fld) {
00067 fnew = fld_new(nm);
00068 return fnew;
00069 }
00070 else if (fld->next) {
00071
00072 fld_add((FormField *)(fld->next), nm);
00073 return fld;
00074 }
00075 else {
00076 fnew = fld_new(nm);
00077 fld->next = fnew;
00078 return fld;
00079 }
00080 return NULL;
00081 }
00082
00086 int fld_count(FormField *fld) {
00087 FormField *f = fld;
00088 int cnt = 0;
00089
00090 while (f) {
00091 cnt++;
00092 f = f->next;
00093 }
00094 return cnt;
00095 }
00096
00101 FormField *fld_free(FormField *fld) {
00102 if (! fld)
00103 return NULL;
00104
00105 if (fld->next)
00106 fld_free(fld->next);
00107
00108 fld_set_name(fld, NULL);
00109 fld_set_value(fld, NULL);
00110 free(fld);
00111 return NULL;
00112 }
00113
00118 FormField *fld_get(FormField *fld, int i) {
00119 if (! fld)
00120 return NULL;
00121
00122 if (! i)
00123 return fld;
00124 else if (fld->next)
00125 return fld_get(fld->next, i-1);
00126 else
00127 return NULL;
00128 }
00129
00133 char *fld_get_help(FormField *fld) {
00134 if (! fld)
00135 return NULL;
00136
00137 return fld->help;
00138 }
00139
00143 FieldRelevance fld_get_relevance(FormField *fld) {
00144 if (! fld)
00145 return FR_OPTIONAL;
00146
00147 return fld->rel;
00148 }
00149
00153 char *fld_get_tip(FormField *fld) {
00154 if (! fld)
00155 return NULL;
00156
00157 return fld->tip;
00158 }
00159
00168 FieldType fld_get_type(FormField *fld) {
00169 if (! fld)
00170 return FT_NONE;
00171
00172 return fld->type;
00173 }
00174
00178 char *fld_get_name(FormField *fld) {
00179 if (! fld)
00180 return NULL;
00181
00182 return fld->name;
00183 }
00184
00188 char *fld_get_value(FormField *fld) {
00189 if (! fld)
00190 return NULL;
00191
00192 return fld->value;
00193 }
00194
00196 char *fld_get_value_by_name(FormField *fld, char *nm) {
00197 if (! fld)
00198 return NULL;
00199
00200 if ((fld->name) && (!strcmp(nm, fld->name)))
00201 return fld->value;
00202
00203 if (fld->next)
00204 return fld_get_value_by_name(fld->next, nm);
00205
00206 return NULL;
00207 }
00208
00210 FormField *fld_new(char *nm) {
00211 FormField *fnew = (FormField *)calloc(1, sizeof(FormField));
00212 if (fnew) {
00213 fnew->type = FT_TEXT;
00214 fnew->rel = FR_OPTIONAL;
00215 if (nm)
00216 fnew->name = strdup(nm);
00217 }
00218 return fnew;
00219 }
00220
00222 FormField *fld_next(FormField *fld) {
00223 if (! fld)
00224 return NULL;
00225 else
00226 return fld->next;
00227 }
00228
00232 void fld_set_type(FormField *fld, FieldType typ) {
00233 if (! fld)
00234 return;
00235
00236 fld->type = typ;
00237 }
00238
00242 void fld_set_help(FormField *fld, char *hlp) {
00243 if (! fld)
00244 return;
00245
00246 if (fld->help)
00247 free(fld->help);
00248
00249 if (hlp)
00250 fld->help = strdup(hlp);
00251 }
00252
00256 void fld_set_relevance(FormField *fld, FieldRelevance r) {
00257 if (! fld)
00258 return;
00259
00260 fld->rel = r;
00261 }
00262
00266 void fld_set_tip(FormField *fld, char *txt) {
00267 if (! fld)
00268 return;
00269
00270 if (fld->tip) {
00271 free(fld->tip);
00272 fld->tip = NULL;
00273 }
00274
00275 if (txt)
00276 fld->tip = strdup(txt);
00277 }
00278
00280 FormField *fld_set_name(FormField *fld, char *nm) {
00281 if (! fld)
00282 return NULL;
00283
00284 if (fld->name)
00285 free(fld->name);
00286
00287 if (nm)
00288 fld->name = strdup(nm);
00289 else
00290 fld->name = NULL;
00291
00292 return fld;
00293 }
00294
00298 void fld_set_value(FormField *fld, char *val) {
00299 if (! fld)
00300 return;
00301
00302 if (fld->value)
00303 free(fld->value);
00304
00305 if (val)
00306 fld->value = strdup(val);
00307 else
00308 fld->value = NULL;
00309 }
00310
00312 char *fld_set_value_by_name(FormField *fld, char *nm, char *val) {
00313 if (! fld)
00314 return NULL;
00315
00316 if ((fld->name) && (!strcmp(nm, fld->name)))
00317 fld_set_value(fld, val);
00318 else if (fld->next)
00319 return fld_set_value_by_name(fld->next, nm, val);
00320
00321 return NULL;
00322 }
00323
00325 FormField *frm_add_field(Form *frm, char *nm, char *val) {
00326 FormField *f;
00327 if (! frm)
00328 return NULL;
00329
00330 frm->fld = fld_add(frm->fld, nm);
00331 f = frm_last_field(frm);
00332 if (f)
00333 fld_set_value(f, val);
00334 return f;
00335 }
00336
00342 Form *frm_clone(Form *frm) {
00343 Form *f;
00344
00345 if (! frm)
00346 return NULL;
00347
00348 f = frm_new(frm);
00349 return f;
00350 }
00351
00352
00356 void frm_copy(Form *dst, Form *src) {
00357 FormField *fld;
00358 int fields;
00359 int i;
00360 char *name;
00361 char *val;
00362
00363 if ((! dst) || (! src))
00364 return;
00365
00366 frm_clear(dst);
00367 frm_set_title(dst, frm_get_title(src));
00368
00369 fields = frm_get_field_count(src);
00370 for (i=0; i<fields; i++) {
00371 fld = frm_get_field(src, i);
00372 if (fld) {
00373 name = fld_get_name(fld);
00374 if (name) {
00375 val = fld_get_value_by_name(fld, name);
00376 frm_add_field(dst, name, val);
00377 }
00378 }
00379 }
00380 }
00381
00386 ABuf *frm_check_fields(Form * frm)
00387 {
00388 FormField *fld;
00389
00390 int i;
00391 int fieldcount;
00392
00393 char *value;
00394 ABuf *errmsg = NULL;
00395 FieldRelevance rel;
00396
00397
00398
00399 fieldcount = frm_get_field_count(frm);
00400 for (i = 0; i < fieldcount; i++) {
00401 fld = frm_get_field(frm, i);
00402 rel = fld_get_relevance(fld);
00403 if (rel == FR_REQUIRED) {
00404 value = fld_get_value(fld);
00405 if ((value == NULL) || (strlen(value) == 0)) {
00406
00407 errmsg = buf_strcat(errmsg, fld_get_name(fld));
00408 errmsg = buf_strcat(errmsg, ", ");
00409 }
00410 }
00411 }
00412 if (errmsg != NULL) {
00413
00414 errmsg = buf_str_shrinkbyone(errmsg);
00415 errmsg = buf_str_shrinkbyone(errmsg);
00416 }
00417 return errmsg;
00418 }
00419
00422 void frm_clear(Form *frm) {
00423 frm_set_title(frm, NULL);
00424 fld_free(frm->fld);
00425 return;
00426 }
00427
00430 void frm_clear_fields(Form *frm) {
00431 FormField *fld;
00432
00433 if (frm == NULL)
00434 return;
00435
00436 fld = frm->fld;
00437 while (fld != NULL) {
00438 fld_set_value(fld, NULL);
00439 fld = fld->next;
00440 }
00441 }
00442
00444 Form *frm_free(Form *f) {
00445 frm_set_title(f, NULL);
00446 fld_free(f->fld);
00447 free(f);
00448 return NULL;
00449 }
00450
00452 FormField *frm_get_field(Form *frm, int n) {
00453 if ((! frm) || (! frm->fld))
00454 return NULL;
00455
00456 return fld_get(frm->fld, n);
00457 }
00458
00460 FieldType frm_get_field_type(Form *frm, int n) {
00461 FormField *fld;
00462
00463 if ((! frm) || (! frm->fld))
00464 return FT_NONE;
00465
00466 fld = frm_get_field(frm, n);
00467 if (fld != NULL)
00468 return fld_get_type(fld);
00469
00470 return FT_NONE;
00471 }
00472
00474 int frm_get_field_count(Form *frm) {
00475 if ((! frm) || (! frm->fld))
00476 return 0;
00477
00478 return fld_count(frm->fld);
00479 }
00480
00482 char *frm_get_field_name(Form *frm, int i) {
00483 FormField *fld;
00484
00485 if ((! frm) || (! frm->fld))
00486 return NULL;
00487
00488 fld = frm_get_field(frm, i);
00489 return fld_get_name(fld);
00490 }
00491
00493 FormField *fld_get_last(FormField *fld) {
00494 FormField *f = fld;
00495
00496 if (! f)
00497 return NULL;
00498
00499 while (f->next)
00500 f = f->next;
00501
00502 return f;
00503 }
00504
00506 char *frm_get_title(Form *frm) {
00507 if (! frm)
00508 return NULL;
00509
00510 return frm->title;
00511 }
00512
00517 char *frm_get_value(Form *frm, int i) {
00518 FormField *fld;
00519
00520 if (! frm)
00521 return NULL;
00522
00523 if (! frm->fld)
00524 return NULL;
00525
00526 fld = frm_get_field(frm, i);
00527 if (fld == NULL)
00528 return NULL;
00529 else
00530 return fld_get_value(fld);
00531 }
00532
00534 char *frm_get_value_by_name(Form *frm, char *nm) {
00535 return fld_get_value_by_name(frm->fld, nm);
00536 }
00537
00539 FormField *frm_last_field(Form *frm) {
00540 if ((! frm) || (! frm->fld))
00541 return NULL;
00542
00543 return fld_get_last(frm->fld);
00544 }
00545
00552 int frm_load_file(Form *frm, char *fn)
00553 {
00554 FILE *ff;
00555 char buf[1024];
00556 char key[LONGEST_KEY + 1];
00557 char *val;
00558
00559 if ((frm == NULL) || (fn == NULL))
00560 return 1;
00561
00562 frm_clear(frm);
00563
00564 ff = fopen(fn, "r");
00565 if (!ff) {
00566 perror("opening form file for reading");
00567 frm_set_value_by_name(frm, FRM_ERROR, "Could not open form file");
00568 return 1;
00569 }
00570
00571 while (fgets(buf, sizeof(buf), ff)) {
00572 char *colon = strchr(buf, ':');
00573 if (colon) {
00574 *colon = '\0';
00575 strcpy(key, buf);
00576 val = colon;
00577 val++;
00578
00579
00580 while ((*val) && (isspace(*val)))
00581 val++;
00582
00583 if (strlen(val) > 0) {
00584 frm_define_field(frm, key, val);
00585 }
00586 }
00587 }
00588 frm_print(frm);
00589 return 0;
00590 }
00591
00596 int frm_match(Form *frm1, Form *frm2) {
00597 char *name;
00598 char *val1;
00599 char *val2;
00600 int i;
00601 int fields1 = frm_get_field_count(frm1);
00602 int fields2 = frm_get_field_count(frm2);
00603
00604 if (fields1 != fields2)
00605 return 0;
00606
00607 for (i=0; i<fields1; i++) {
00608 name = frm_get_field_name(frm1, i);
00609 val1 = frm_get_value(frm1, i);
00610 val2 = frm_get_value_by_name(frm2, name);
00611 if (val1 == NULL) {
00612 if (val2 != NULL)
00613 return 0;
00614 }
00615 else {
00616 if (val2 == NULL)
00617 return 0;
00618 if (! strcmp(val1, val2))
00619 return 0;
00620 }
00621 }
00622 return 1;
00623 }
00624
00626 Form *frm_new(Form *frm) {
00627 Form *f = calloc(1, sizeof(Form));
00628 if (frm)
00629 frm_copy(f, frm);
00630
00631 return f;
00632 }
00633
00636 void frm_print(Form *frm) {
00637 FormField *fld;
00638 if (frm == NULL)
00639 return;
00640
00641 printf("Title: %s\n", frm_get_title(frm));
00642 printf("=Fields=\n");
00643 fld = frm->fld;
00644 while (fld != NULL) {
00645 printf(" %s: %s|%s|%s\n", fld_get_name(fld), fld_get_value(fld), fld_get_tip(fld), fld_get_help(fld));
00646 }
00647 }
00648
00653 int frm_save_file(Form *frm, char *fn)
00654 {
00655 FILE *ff;
00656 FormField *fld;
00657 char *s;
00658 ABuf *buf = buf_new(256);
00659
00660 if ((frm == NULL) || (fn == NULL))
00661 return 1;
00662
00663 ff = fopen(fn, "w");
00664 if (!ff) {
00665 perror("opening workspace file for writing");
00666 frm_set_value_by_name(frm, FRM_ERROR, "Can't open form file for writing.");
00667 return -1;
00668 }
00669
00670 s = frm_get_title(frm);
00671 if (s != NULL)
00672 fprintf(ff, "Title: %s\n", s);
00673
00674 fld = frm->fld;
00675 while (fld != NULL) {
00676 s = fld_get_name(fld);
00677 if (s) {
00678 buf = buf_strcpy(buf, s);
00679 buf = buf_strcat(buf, ": ");
00680 s = fld_get_value(fld);
00681 if (s == NULL)
00682 s = "";
00683 buf = buf_strcat(buf, s);
00684 s = fld_get_tip(fld);
00685 if ((s != NULL) && (strlen(s) > 0)) {
00686 buf = buf_strcat(buf, "|");
00687 buf = buf_strcat(buf, s);
00688 s = fld_get_help(fld);
00689 if ((s != NULL) && (strlen(s) > 0)) {
00690 buf = buf_strcat(buf, "|");
00691 buf = buf_strcat(buf, s);
00692 }
00693 }
00694 fprintf(ff, "%s\n", buf->b_dat);
00695 }
00696 fld = fld_next(fld);
00697 }
00698 buf_free(buf);
00699 return 0;
00700 }
00701
00703 void frm_set_field_type(Form *frm, int id, int typ) {
00704 FormField *fld;
00705
00706 if ((! frm) || (! frm->fld))
00707 return;
00708
00709 fld = frm_get_field(frm, id);
00710 if (fld != NULL)
00711 fld_set_type(fld, typ);
00712 }
00713
00715 Form *frm_set_title(Form *f, char *ttl) {
00716 if (! f)
00717 return NULL;
00718
00719 if (f->title) {
00720 free(f->title);
00721 f->title = NULL;
00722 }
00723
00724 f->title = strdup(ttl);
00725 return f;
00726 }
00727
00729 void frm_set_value_by_name(Form *frm, char *nm, char *val) {
00730 fld_set_value_by_name(frm->fld, nm, val);
00731 }
00732
00739 void frm_define_field(Form *frm, char *nm, char *val) {
00740 FormField *fld;
00741 char *value = NULL;
00742 char *tip = NULL;
00743 char *help = NULL;
00744 char *pipe = NULL;
00745 char *start = val;
00746
00747
00748 pipe = strchr(start, '|');
00749 value = val;
00750 if (pipe == NULL) {
00751
00752 goto done;
00753 }
00754
00755
00756 *pipe = '\0';
00757
00758
00759 start = pipe;
00760 start++;
00761
00762 if (strlen(start) == 0)
00763
00764 goto done;
00765
00766 tip = start;
00767
00768
00769 pipe = strchr(start, '|');
00770 if (pipe == NULL) {
00771
00772 goto done;
00773 }
00774
00775
00776 *pipe = '\0';
00777
00778 start = pipe;
00779 start++;
00780
00781 if (strlen(start) == 0)
00782 goto done;
00783
00784 help = start;
00785
00786 done:
00787 fld = frm_add_field(frm, nm, val);
00788 if (tip != NULL)
00789 fld_set_tip(fld, tip);
00790
00791 if (help != NULL)
00792 fld_set_help(fld, help);
00793 }