Annotation of researchv10no/ipc/mgrs/ns/attribute.c, revision 1.1.1.1

1.1       root        1: #include <libc.h>
                      2: #include <fio.h>
                      3: #include <string.h>
                      4: #include "dbtypes.h"
                      5: 
                      6: /*
                      7:  *  free the value and type of an attribute
                      8:  */
                      9: Attribute::~Attribute()
                     10: {
                     11:        if(value){
                     12:                free(value);
                     13:        }
                     14:        if(type){
                     15:                free(type);
                     16:        }
                     17: }
                     18: 
                     19: /*
                     20:  *  Parse a linear version of an attribute.  Anything ending in an 
                     21:  *  the wildcard character specifies that this attribute is a key matching
                     22:  *  anything following the wildcard position.
                     23:  *
                     24:  *  Any unrooted domain name is treated has a '.' attached and is treated
                     25:  *  as if it ended in a wild card.
                     26:  */
                     27: Attribute::Attribute(char *str, Tuple *t, char wildcard)
                     28: {
                     29:        char *ttype;
                     30:        char *wildp;
                     31:        char *p;
                     32: 
                     33:        ttype = strchr(str, ',');
                     34:        if(ttype){
                     35:                *ttype++ = '\0';
                     36:                type = strdup(ttype);
                     37:        } else
                     38:                type = (char *)0;
                     39: 
                     40:        wildp = str+strlen(str)-1;
                     41:        if(*wildp==wildcard){
                     42:                *wildp = '\0';
                     43:                wild = 1;
                     44:        } else
                     45:                wild = 0;
                     46: 
                     47:        if(fstrcmp(type, "dom")==0){
                     48:                /*
                     49:                 *  domains are case insensitive, convert to lower
                     50:                 */
                     51:                for(p = str; *p; p++)
                     52:                        *p = tolower(*p);
                     53: 
                     54:                /*
                     55:                 *  root the wild card
                     56:                 */
                     57:                if(wildcard && type && !wild && *wildp!='.'){
                     58:                        *(wildp+1) = '.';
                     59:                        *(wildp+2) = '\0';
                     60:                        wild = 1;
                     61:                }
                     62:        }
                     63:        value = strdup(str);
                     64:        tuple = t;
                     65:        next = 0;
                     66: }
                     67: 
                     68: /*
                     69:  *  Compute the distance between two attributes.  The distance measure is at
                     70:  *  most MAXDISTANCE and depends on the type of the attributes.  Only attributes
                     71:  *  of the same type match.
                     72:  */
                     73: Attribute::distance(Attribute *origin)
                     74: {
                     75:        if(type==0 || fstrcmp(origin->type, type)!=0)
                     76:                return MAXDISTANCE;
                     77:        else if(fstrcmp(origin->type, "dom")==0)
                     78:                return dom_distance(value, origin->value);
                     79:        else if(fstrcmp(origin->type, "dk")==0)
                     80:                return dk_distance(value, origin->value);
                     81:        return MAXDISTANCE;
                     82: }
                     83: 
                     84: /*
                     85:  *  output a linear version of the attribute on fd
                     86:  */
                     87: int
                     88: Attribute::simpleprint(int fd)
                     89: {
                     90:        if(type)
                     91:                return Fprint(fd, "%s,%s ", value, type);
                     92:        else
                     93:                return Fprint(fd, "%s ", value);
                     94: }
                     95: void
                     96: Attribute::print(int fd)
                     97: {
                     98:        simpleprint(fd);
                     99:        if(tuple){
                    100:                Fprint(fd, " -> ");
                    101:                tuple->print(fd);
                    102:        }
                    103: }
                    104: 
                    105: /*
                    106:  *  return true if this is a key attribute
                    107:  */
                    108: int
                    109: Attribute::iskey()
                    110: {
                    111:        return fstrcmp(type, "org")!=0;
                    112: }
                    113: 
                    114: /*
                    115:  *  compare 2 attributes.  the key may have the type "name" which matches
                    116:  *  only an empty type.
                    117:  */
                    118: Attribute::compare(Ordered *o)
                    119: {
                    120:        register rv;
                    121:        Attribute *pattern=(Attribute *)o;
                    122: 
                    123:        if(pattern->wild)
                    124:                rv = strncmp(value, pattern->value, strlen(pattern->value));
                    125:        else
                    126:                rv = fstrcmp(value, pattern->value);
                    127:        if(rv==0){
                    128:                if(pattern->type && strcmp(pattern->type, "name")!=0){
                    129:                        if(type)
                    130:                                rv = fstrcmp(type, pattern->type);
                    131:                        else
                    132:                                rv = -1;
                    133:                } else {
                    134:                        if(type && pattern->type)
                    135:                                rv = -1;
                    136:                }
                    137:        }
                    138:        return rv;
                    139: }
                    140: 
                    141: /*
                    142:  *  Compare 2 attributes.  If they have matching values, return non-zero.
                    143:  */
                    144: Attribute::compatible(Ordered *o)
                    145: {
                    146:        Attribute *pattern=(Attribute *)o;
                    147: 
                    148:        if(pattern->wild)
                    149:                return !strncmp(value, pattern->value, strlen(pattern->value));
                    150:        else
                    151:                return !fstrcmp(value, pattern->value);
                    152: }
                    153: 
                    154: /*
                    155:  *  Print the value if attribute type == t.  Return 0 if a value
                    156:  *  is printed.
                    157:  */
                    158: int
                    159: Attribute::printvalue(int fd, char *t)
                    160: {
                    161:        if(type){
                    162:                if (strcmp(t, type)==0){
                    163:                        Fprint(fd, "\t%s\n", value);
                    164:                        return 0;
                    165:                }
                    166:        } else if(strcmp(t, "name")==0){
                    167:                Fprint(fd, "\t%s\n", value);
                    168:                return 0;
                    169:        }
                    170:        return -1;
                    171: }

unix.superglobalmegacorp.com

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