oid.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 926 行 · 第 1/2 页
C
926 行
if (left <= 20) { buflen += LINESIZE; if ((buffer = realloc(buffer, (unsigned)buflen)) == NULL) return (NULL); size = strlen(buffer); buf = buffer + size - 1; left = buflen - size; } } } else done = FALSE; } while (done == FALSE); return (buffer);}static char * get_entry (){register char * buf;register char * ptr; /* read next line - test for macro defs */ while (1) { /* return out */ if ((buf = get_line ()) == NULLCP) return (NULLCP); if ((ptr = index (buf,'=')) != 0) { *ptr++ = 0; if (oc_macro_add != NULLIFP) { (*oc_macro_add) (buf,ptr); } } else return (buf); }}oid_table_attr *name2attr(nodename)char * nodename;{register int i;register char * ptr;char * str;register oid_table_attr * atrptr = &attrOIDTable[0]; attr_index = 0; if ((ptr = rindex (nodename,DOT)) == 0) { struct pair *p; for (p = Pbuckets[PHASH (nodename)]; p && lexequ (p -> p_name, nodename); p = p -> p_chain) ; /* NO-OP */ if ((p != NULL) && (p->p_type == ATTR)) { attr_index = ((oid_table_attr *) p->p_value) - atrptr; return ( (oid_table_attr *) p->p_value); } else return (NULLTABLE_ATTR); } else { if ((str = get_oid (nodename)) == NULLCP) { LLOG (log_dsap,LLOG_FATAL,("invalid oid '%s'",nodename)); return (NULLTABLE_ATTR); } if (isdigit (*++ptr)) { for (i=0;i<attrNumEntries;i++,atrptr++) if (lexequ (atrptr->oa_ot.ot_stroid, str) == 0) { attr_index = atrptr - &attrOIDTable[0]; return (atrptr); } return (NULLTABLE_ATTR); } else { for (i=0;i<attrNumEntries;i++,atrptr++) if (lexequ (atrptr->oa_ot.ot_name, ptr) == 0) if (strncmp (str,atrptr->oa_ot.ot_stroid,strlen(str)) == 0) { attr_index = atrptr - &attrOIDTable[0]; return (atrptr); } else return (NULLTABLE_ATTR); } } return (NULLTABLE_ATTR); }set_heap (x)AttributeType x;{ if (x == NULLTABLE_ATTR) return 0; return (attr_index = x - &attrOIDTable[0]); }oid_table_attr *oid2attr(oid)OID oid;{register int i;register oid_table_attr * ptr = &attrOIDTable[0]; for (i=0;i<attrNumEntries;i++,ptr++) { if (oid_cmp (ptr->oa_ot.ot_oid, oid) == 0) return (ptr); else if (oid_cmp (ptr->oa_ot.ot_aliasoid, oid) == 0) return (ptr); } return (NULLTABLE_ATTR);}objectclass *name2oc(nodename)register char * nodename;{register int i;register char * ptr;char * str;register objectclass * oc = & ocOIDTable[0]; if ((ptr = rindex (nodename,DOT)) == 0) { struct pair *p; for (p = Pbuckets[PHASH (nodename)]; p && lexequ (p -> p_name, nodename); p = p -> p_chain) ; /* NO-OP */ if ((p != NULL) && (p->p_type == OC)) return ( (objectclass *) p->p_value); else return (NULLOBJECTCLASS); } else { str = get_oid (nodename); if (isdigit (*++ptr)) { for (i=0;i<ocNumEntries;i++,oc++) if (lexequ (oc->oc_ot.ot_stroid, str) == 0) return (oc); return (NULLOBJECTCLASS); } else { for (i=0;i<ocNumEntries;i++,oc++) if (lexequ (oc->oc_ot.ot_name, ptr) == 0) if (strncmp (str,oc->oc_ot.ot_stroid,strlen(str)) == 0) return (oc); else return (NULLOBJECTCLASS); } } return (NULLOBJECTCLASS);}objectclass *oid2oc(oid)OID oid;{register int i;register objectclass * oc = &ocOIDTable[0]; for (i=0;i<ocNumEntries;i++,oc++) { if (oid_cmp (oc->oc_ot.ot_oid, oid) == 0) return (oc); else if (oid_cmp (oc->oc_ot.ot_aliasoid, oid) == 0) return (oc); } return (NULLOBJECTCLASS);}static char * full_gen (ot)oid_table * ot;{static char * buffer;register char * ptr;register char * soid;register char * str; if (buffer == NULLCP) buffer = smalloc (LINESIZE); ptr = buffer; buffer [0] = '\0'; str = sprintoid (ot->ot_oid); soid = str; while (*str != '\0') if ( *str == DOT) { *str = '\0'; ptr = soid2gen (soid); if (ptr == NULLCP) { *str++ = DOT; continue; } (void) strcat (buffer,"."); (void) strcat (buffer,ptr); *str++ = DOT; } else str++; (void) strcat (buffer,"."); (void) strcat (buffer,ot->ot_name); return (&buffer[1]);}static char * part_gen (ot)oid_table * ot;{static char * buffer = NULLCP;register char * ptr;register char * soid;register char * str;char * last; if (buffer == NULLCP) buffer = smalloc (LINESIZE); ptr = buffer; if (index (ot->ot_name,DOT) == NULLCP) return (ot->ot_name); str = sprintoid (ot->ot_oid); soid = str; last = str; while (*str != '\0') if ( *str == DOT) { *str = '\0'; ptr = soid2gen (soid); if (ptr == NULLCP) { *str++ = DOT; break; } else (void) strcpy (buffer,ptr); last = str; *str++ = DOT; } else str++; (void) strcat (buffer,last); return (buffer);}#ifndef attr2name_auxchar *attr2name_aux (oa)register oid_table_attr *oa;{ if ( oa != NULLTABLE_ATTR) return (oa->oa_ot.ot_name); else { LLOG (log_dsap,LLOG_EXCEPTIONS,("NULL table entry")); return (NULLCP); }}#endifchar *attr2name(oa,format)register oid_table_attr *oa;int format;{int x; if ( oa != NULLTABLE_ATTR) switch (format) { case OIDFULL: return (full_gen (&oa->oa_ot)); case OIDNUM: return (oa->oa_ot.ot_stroid); default: /* look for long name */ for (x=0; x<Palias_next; x++) if (lexequ (Palias[x].a_full,oa->oa_ot.ot_name) == 0) return (Palias[x].a_alias); return (part_gen (&oa->oa_ot)); } else { LLOG (log_dsap,LLOG_EXCEPTIONS,("NULL table entry")); return (NULLCP); }}char *oc2name(oc,format)register objectclass *oc;int format;{ if ( oc != NULLOBJECTCLASS) switch (format) { case OIDFULL: return (full_gen (&oc->oc_ot)); case OIDNUM: return (oc->oc_ot.ot_stroid); default: return (part_gen (&oc->oc_ot)); } else return (NULLCP);}char *oid2name(oid,format)OID oid;int format;{oid_table_attr * at;objectclass * oc;register int i;register oid_table* ptr = &OIDTable[0];char * sptr; /* try attribute first */ if (( at = oid2attr (oid)) != NULLTABLE_ATTR) return (attr2name(at,format)) ; /* try objectclass */ if (( oc = oid2oc (oid)) != NULLOBJECTCLASS) return (oc2name(oc,format)) ; /* try gen tables */ for (i=0; i<NumEntries;i++,ptr++) { if ((oid_cmp (ptr->ot_oid, oid) == 0) || oid_cmp (ptr->ot_aliasoid, oid) == 0) { switch (format) { case OIDFULL: return (full_gen (ptr)); case OIDNUM: return (ptr->ot_stroid); default: return (part_gen (ptr)); } } } if ((sptr = oid2ode_aux (oid,0)) == NULLCP) parse_error ("Bad OID '%s'",sprintoid (oid)); return (sptr);}OID name2oid (str)register char * str;{register struct pair *p;OID ptr; if (*str == 0) return NULLOID; for (p = Pbuckets[PHASH (str)]; p && lexequ (p -> p_name, str); p = p -> p_chain) ; /* NO-OP */ if (p != NULL) switch (p -> p_type) { case GEN: { oid_table * ot; ot = (oid_table *) p->p_value; return (oid_cpy(ot->ot_oid)); } case ATTR: { oid_table_attr * at; at = (oid_table_attr *) p->p_value; return (oid_cpy(at->oa_ot.ot_oid)) ; } case OC: { objectclass * oc; oc = (objectclass *) p->p_value; return (oid_cpy(oc->oc_ot.ot_oid)) ; } default: if ( (ptr=ode2oid (str)) == NULLOID) return (oid_cpy(str2oid(str))); return (oid_cpy(ptr)); } else { /* try general oid lookup */ char * x; if ((x=get_oid(str)) != NULLCP) return (oid_cpy(str2oid(x))); /* try isobjects */ if ( (ptr=ode2oid (str)) == NULLOID) { if ((ptr=str2oid(str)) == NULLOID) { parse_error ("unknown OID '%s'",str); return NULLOID; } return (oid_cpy(ptr)); } return (oid_cpy(ptr)); }}PE oid2pe (o)OID o;{ /* needed cos of a macro */ return (oid2prim (o)); }oidprint (ps,o,format)PS ps;OID o;int format;{extern int oidformat; if (format == READOUT) ps_printf (ps,"%s",oid2name(o,oidformat)); else ps_printf (ps,"%s",oid2name(o,OIDPART));}OID dup_prim2oid (pe)PE pe;{ OID oid; if (! test_prim_pe (pe,PE_CLASS_UNIV,PE_PRIM_OID)) return (NULLOID); if (( oid = prim2oid(pe)) == NULLOID) return (NULLOID); return (oid_cpy(oid));}void free_oid_buckets(){int i;struct pair *p, *np; for (i=0;i<PBUCKETS;i++) for (p = Pbuckets[i]; p != (struct pair *)NULL ; p = np) { np = p -> p_chain; free (p->p_name); free ((char *)p); } }oid_syntax (){ (void) add_attribute_syntax ("oid", (IFP) oid2pe, (IFP) dup_prim2oid, (IFP) name2oid, oidprint, (IFP) oid_cpy, oid_cmp, oid_free, NULLCP, NULLIFP, FALSE );}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?