Annotation of 43BSDReno/contrib/isode-beta/dsap/common/parse.c, revision 1.1.1.1

1.1       root        1: /* parse.c - */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/parse.c,v 7.1 90/07/09 14:34:54 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/dsap/common/RCS/parse.c,v 7.1 90/07/09 14:34:54 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       parse.c,v $
                     12:  * Revision 7.1  90/07/09  14:34:54  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.0  89/11/23  22:17:56  mrose
                     16:  * Release 6.0
                     17:  * 
                     18:  */
                     19: 
                     20: /*
                     21:  *                               NOTICE
                     22:  *
                     23:  *    Acquisition, use, and distribution of this module and related
                     24:  *    materials are subject to the restrictions of a license agreement.
                     25:  *    Consult the Preface in the User's Manual for the full terms of
                     26:  *    this agreement.
                     27:  *
                     28:  */
                     29: 
                     30: 
                     31: #include "quipu/config.h"
                     32: #include "quipu/util.h"
                     33: #include "quipu/entry.h"
                     34: #include "quipu/ds_error.h"
                     35: #include "quipu/malloc.h"
                     36: #ifdef TURBO_DISK
                     37: #include <gdbm.h>
                     38: #endif
                     39: 
                     40: #ifndef TURBO_DISK
                     41: #define PARSE_BUFFER 10000
                     42: static char parse_buffer [PARSE_BUFFER];
                     43: #endif
                     44: 
                     45: Entry database_root;
                     46: int local_master_size = 0;
                     47: int local_slave_size = 0;
                     48: int local_cache_size = 0;
                     49: 
                     50: #ifdef TURBO_DISK
                     51: extern char    *parse_entry;
                     52: int            dbmeof;
                     53: int            dbmfirst = 1;
                     54: datum          turbo_header_key = { "HEADER", sizeof("HEADER") };
                     55: #endif
                     56: 
                     57: extern  time_t time ();
                     58: 
                     59: #ifdef TURBO_DISK
                     60: char *getline (db)
                     61: GDBM_FILE      db;
                     62: {
                     63:        static datum    newkey, key, dat;
                     64:        static char     *line, *next, *save;
                     65:        static int      new_entry;
                     66:        char            *TidyString();
                     67:        int             save_heap;
                     68: 
                     69:        save_heap = mem_heap;
                     70:        GENERAL_HEAP;
                     71: 
                     72:        if (dbmfirst) {
                     73:                dbmfirst = 0;
                     74:                key = gdbm_firstkey(db);
                     75:                parse_entry = key.dptr;
                     76:                new_entry = 1;
                     77:        } else if (line == NULLCP || *line == '\0') {
                     78:                newkey = gdbm_nextkey(db, key);
                     79:                free(key.dptr);
                     80:                key = newkey;
                     81:                parse_entry = key.dptr;
                     82:                new_entry = 1;
                     83:        }
                     84: 
                     85:        if (key.dptr == NULLCP) {
                     86:                dbmeof = 1;
                     87:                dbmfirst = 1;
                     88:                mem_heap = save_heap;
                     89:                return(NULLCP);
                     90:        }
                     91: 
                     92:        if (new_entry) {
                     93:                /* gross, but we have to skip the header datum */
                     94:                if (strcmp(key.dptr, turbo_header_key.dptr) == 0) {
                     95:                        newkey = gdbm_nextkey(db, key);
                     96:                        free(key.dptr);
                     97:                        key = newkey;
                     98:                        if (key.dptr == NULLCP) {
                     99:                                parse_entry = key.dptr;
                    100:                                dbmeof = 1;
                    101:                                dbmfirst = 1;
                    102:                                mem_heap = save_heap;
                    103:                                return(NULLCP);
                    104:                        }
                    105:                }
                    106: 
                    107:                new_entry = 0;
                    108:                parse_entry = key.dptr;
                    109:                dat = gdbm_fetch(db, key);
                    110: 
                    111:                if ((line = dat.dptr) == NULLCP) {
                    112:                        parse_error("edb error - null dbm data");
                    113:                        return(NULLCP);
                    114:                }
                    115:        }
                    116: 
                    117:        if (*line == '\n') {
                    118:                line = NULLCP;
                    119:                free(dat.dptr);
                    120:                mem_heap = save_heap;
                    121:                return("");
                    122:        }
                    123: 
                    124:        line = SkipSpace(line);
                    125:        while (*line == '#') {
                    126:                line = index(line, '\n') + 1;
                    127:                if (*line == '\0') {
                    128:                        mem_heap = save_heap;
                    129:                        return(NULLCP);
                    130:                }
                    131:                line = SkipSpace(line);
                    132:        }
                    133: 
                    134:        next = index(line, '\n');
                    135:        *next++ = '\0';
                    136:        save = line;
                    137:        line = next;
                    138: 
                    139:        mem_heap = save_heap;
                    140:        return(TidyString(save));
                    141: }
                    142: 
                    143: #else
                    144: 
                    145: char * getline (file)
                    146: FILE * file;
                    147: {
                    148: extern int parse_line;
                    149: char * ptr;
                    150: extern char * TidyString ();
                    151: 
                    152:        while ( fgets (parse_buffer,PARSE_BUFFER,file) != NULLCP) {
                    153:                parse_line++;
                    154:                ptr = SkipSpace (parse_buffer);
                    155:                if (*ptr != '#')
                    156:                        return (TidyString(ptr));
                    157:        }
                    158: 
                    159:        return (NULLCP);
                    160: 
                    161: }
                    162: 
                    163: #endif
                    164: 
                    165: Attr_Sequence get_attributes_aux (file)
                    166: #ifdef TURBO_DISK
                    167: GDBM_FILE      file;
                    168: #else
                    169: FILE * file;
                    170: #endif
                    171: {
                    172: Attr_Sequence as = NULLATTR;
                    173: Attr_Sequence as_combine ();
                    174: char * ptr;
                    175: 
                    176:        if ((ptr = getline (file)) == NULLCP)
                    177:                return (NULLATTR);
                    178: 
                    179:        while ( *ptr != 0 ) {
                    180:                as = as_combine (as,ptr);
                    181:                if ((ptr = getline (file)) == NULLCP)
                    182:                        break;
                    183:        }
                    184:        return (as);
                    185: }
                    186: 
                    187: Attr_Sequence get_attributes (file)
                    188: #ifdef TURBO_DISK
                    189: GDBM_FILE      file;
                    190: #else
                    191: FILE * file;
                    192: #endif
                    193: {
                    194: extern int parse_status;
                    195: extern int parse_line;
                    196: 
                    197:        parse_status = 0;
                    198:        parse_line   = 0;
                    199: 
                    200:        return (get_attributes_aux (file));
                    201: }
                    202: 
                    203: 
                    204: Entry get_entry_aux (file,parent,dtype)
                    205: #ifdef TURBO_DISK
                    206: GDBM_FILE      file;
                    207: #else
                    208: FILE * file;
                    209: #endif
                    210: Entry parent;
                    211: int dtype;
                    212: {
                    213: Entry eptr;
                    214: char * ptr;
                    215: extern RDN parse_rdn;
                    216: struct DSError err;
                    217: extern int print_parse_errors;
                    218: extern int parse_line;
                    219: int save; 
                    220: extern PS opt;
                    221: char check = TRUE;
                    222: 
                    223:        DATABASE_HEAP;
                    224: 
                    225:        eptr = get_default_entry (parent);
                    226:        eptr->e_data = dtype;
                    227: 
                    228:        if ((ptr = getline (file)) == NULLCP) {
                    229:                GENERAL_HEAP;
                    230:                return (NULLENTRY);
                    231:        }
                    232:                
                    233:        while (*ptr == 0)
                    234:                if ((ptr = getline (file)) == NULLCP) {
                    235:                        GENERAL_HEAP;
                    236:                        return (NULLENTRY);
                    237:                }
                    238: 
                    239:        if ((eptr->e_name = str2rdn (ptr)) == NULLRDN) {
                    240:                parse_error ("invalid rdn %s",ptr);
                    241:                check = FALSE;
                    242:        }
                    243:        
                    244:        parse_rdn = eptr->e_name;
                    245:        eptr->e_attributes = get_attributes_aux (file);
                    246: 
                    247:        if (check) {
                    248:                save = parse_line;
                    249:                parse_line = 0;
                    250:                if (unravel_attribute (eptr,&err) != OK) {
                    251:                        parse_error ("Error in entry ending line %d...",(char *) save);
                    252:                        if (print_parse_errors)
                    253:                                ds_error (opt,&err);
                    254:                } 
                    255:                if (check_schema (eptr,NULLATTR,&err) != OK) {
                    256:                        parse_error ("Schema error in entry ending line %d...",(char *) save);
                    257:                        if (print_parse_errors)
                    258:                                ds_error (opt,&err);
                    259:                } 
                    260:                parse_line = save;
                    261:        }
                    262:        parse_rdn = NULLRDN;
                    263: 
                    264:        GENERAL_HEAP;
                    265: 
                    266:        switch (dtype) {
                    267:        case E_TYPE_SLAVE:
                    268:                local_slave_size++; break;
                    269:        case E_DATA_MASTER:
                    270:                local_master_size++; break;
                    271:        case E_TYPE_CACHE_FROM_MASTER:
                    272:                eptr->e_age = time ((time_t *)0);
                    273:                local_cache_size++; break;
                    274:        }
                    275: 
                    276:        return (eptr);
                    277: }
                    278: 
                    279: 
                    280: Entry get_entry (file,parent,dtype)
                    281: #ifdef TURBO_DISK
                    282: GDBM_FILE      file;
                    283: #else
                    284: FILE * file;
                    285: #endif
                    286: Entry parent;
                    287: int dtype;
                    288: {
                    289: extern int parse_status;
                    290: extern int parse_line;
                    291: 
                    292:        parse_status = 0;
                    293:        parse_line   = 0;
                    294: 
                    295:        return (get_entry_aux (file,parent,dtype));
                    296: }
                    297: 
                    298: 
                    299: Entry new_constructor (parent)
                    300: Entry parent;
                    301: {
                    302: Entry constructor;
                    303: 
                    304:        constructor = get_default_entry (parent);
                    305:        constructor->e_leaf = FALSE;
                    306:        constructor->e_complete = FALSE;
                    307:        constructor->e_data = E_TYPE_CONSTRUCTOR;
                    308:        constructor->e_acl = acl_alloc ();
                    309:        constructor->e_acl->ac_child = acl_dflt ();
                    310:        constructor->e_acl->ac_entry = acl_dflt ();
                    311:        constructor->e_acl->ac_default = acl_dflt ();
                    312:        constructor->e_acl->ac_attributes = NULLACL_ATTR;
                    313:        return (constructor);
                    314: }
                    315: 
                    316: 
                    317: Entry make_path (dn)
                    318: DN dn;
                    319: {
                    320: Entry ptr;
                    321: register RDN    a_rdn, b_rdn;
                    322: 
                    323:        if ((database_root == NULLENTRY) || (database_root->e_child == NULLENTRY)) {
                    324:                database_root = new_constructor(NULLENTRY);
                    325:                ptr = database_root;
                    326:                for (; dn!= NULLDN; dn=dn->dn_parent) {
                    327:                        ptr->e_child = new_constructor(ptr);
                    328:                        ptr = ptr->e_child;
                    329:                        ptr->e_name = rdn_cpy (dn->dn_rdn);
                    330:                }
                    331:                return (ptr);
                    332:        } else {
                    333:                /* follow links as far as poss, then add new bits */
                    334: 
                    335:                if (dn == NULLDN)
                    336:                        return (database_root);
                    337: 
                    338:                ptr = database_root->e_child;
                    339:                b_rdn = dn->dn_rdn;
                    340:                a_rdn = ptr->e_name ;
                    341: 
                    342:                for(;;) { /* return out */
                    343:                        while (rdn_cmp (a_rdn, b_rdn) != OK) {
                    344:                                if (ptr->e_sibling == NULLENTRY) {
                    345:                                   ptr->e_sibling = new_constructor(ptr->e_parent);
                    346:                                   ptr = ptr->e_sibling;
                    347:                                   ptr->e_name = rdn_cpy (dn->dn_rdn);
                    348:                                   for (dn=dn->dn_parent; dn!= NULLDN; dn=dn->dn_parent) {
                    349:                                        ptr->e_child = new_constructor(ptr);
                    350:                                        ptr = ptr->e_child;
                    351:                                        ptr->e_name = rdn_cpy (dn->dn_rdn);
                    352:                                   }
                    353:                                   return (ptr);
                    354:                                }
                    355:                                ptr = ptr->e_sibling;
                    356:                                a_rdn = ptr->e_name ;
                    357:                        }
                    358: 
                    359:                        if ( dn->dn_parent == NULLDN)
                    360:                                return (ptr);
                    361: 
                    362:                        dn = dn->dn_parent;
                    363:                        b_rdn = dn->dn_rdn;
                    364: 
                    365:                        if ( ptr->e_child == NULLENTRY) {
                    366:                                for (; dn!= NULLDN; dn=dn->dn_parent) {
                    367:                                        ptr->e_child = new_constructor(ptr);
                    368:                                        ptr = ptr->e_child;
                    369:                                        ptr->e_name = rdn_cpy (dn->dn_rdn);
                    370:                                }
                    371:                                return (ptr);
                    372:                        }
                    373:                        ptr = ptr->e_child;
                    374:                        a_rdn = ptr->e_name;
                    375:                }
                    376: 
                    377:        }
                    378:        /* NOTREACHED */
                    379: 
                    380: }
                    381: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.