Main Page   Modules   Alphabetical List   Data Structures   File List   Data Fields   Globals   Related Pages  

forms.c

Go to the documentation of this file.
00001 
00020 /* $Id: forms_8c-source.html,v 1.4 2004/05/09 09:31:55 darryll Exp $
00021  * GtkSQL -- an interactive graphical query tool for PostgreSQL
00022  * Copyright (C) 2003 Darryl Luff
00023  *
00024  * This program is free software; you can redistribute it and/or modify
00025  * it under the terms of the GNU General Public License as published by
00026  * the Free Software Foundation; either version 2 of the License, or
00027  * (at your option) any later version.
00028  *
00029  * This program is distributed in the hope that it will be useful,
00030  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00031  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00032  * GNU General Public License for more details.
00033  *
00034  * You should have received a copy of the GNU General Public License
00035  * along with this program; if not, write to the Free Software
00036  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
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         /* pass it on   */
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)  /* nothing there    */
00170         return FT_NONE;
00171 
00172     return fld->type;
00173 }
00174 
00178 char *fld_get_name(FormField *fld) {
00179     if (! fld)  /* nothing there    */
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     /* Creates the notebook pane and label */
00398     /* The connection pane */
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                 /* No good. */
00407                 errmsg = buf_strcat(errmsg, fld_get_name(fld));
00408                 errmsg = buf_strcat(errmsg, ", ");
00409             }
00410         }
00411     }
00412     if (errmsg != NULL) {
00413         /* Remove the trainling ", "    */
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             /* Skip leading white space */
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     /* Find value.  */
00748     pipe = strchr(start, '|');
00749     value = val;
00750     if (pipe == NULL) {
00751         /* Whole string must be value.  */
00752         goto done;
00753     }
00754 
00755     /* terminate value string.  */
00756     *pipe = '\0';
00757 
00758     /* Look for tip.    */
00759     start = pipe;
00760     start++;
00761 
00762     if (strlen(start) == 0)
00763         /* No tip text. */
00764         goto done;
00765 
00766     tip = start;
00767 
00768     /* Look for help    */
00769     pipe = strchr(start, '|');
00770     if (pipe == NULL) {
00771         /* Rest of string Whole string must be tip. */
00772         goto done;  
00773     }
00774 
00775     /* terminate tip    */
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 }

Generated on Sun May 9 19:19:16 2004 for GtkSQL by doxygen1.2.18