]> git.sur5r.net Git - openldap/commitdiff
Prep for in-place parsing. Cache a ber_tag byte.
authorHoward Chu <hyc@openldap.org>
Sun, 6 Jan 2002 02:23:36 +0000 (02:23 +0000)
committerHoward Chu <hyc@openldap.org>
Sun, 6 Jan 2002 02:23:36 +0000 (02:23 +0000)
No visible impact from these changes.

libraries/liblber/decode.c
libraries/liblber/io.c

index 1d4899f9852a7af3a8e3221e24cf0707521fcbc7..807bb98de42321cd16013dccebc48fbbb20d4dd1 100644 (file)
@@ -44,10 +44,16 @@ ber_get_tag( BerElement *ber )
        assert( ber != NULL );
        assert( LBER_VALID( ber ) );
 
-       if ( ber_read( ber, (char *) &xbyte, 1 ) != 1 ) {
+       if ( ber_pvt_ber_remaining( ber ) < 1 ) {
                return LBER_DEFAULT;
        }
 
+       if ( ber->ber_ptr == ber->ber_buf )
+               xbyte = *ber->ber_ptr;
+       else
+               xbyte = ber->ber_tag;
+       ber->ber_ptr++;
+
        tag = xbyte;
 
        if ( (xbyte & LBER_BIG_TAG_MASK) != LBER_BIG_TAG_MASK ) {
@@ -146,6 +152,7 @@ ber_skip_tag( BerElement *ber, ber_len_t *len )
        if( *len > (ber_len_t) ber_pvt_ber_remaining( ber ) ) {
                return LBER_DEFAULT;
        }
+       ber->ber_tag = *ber->ber_ptr;
 
        return tag;
 }
@@ -161,11 +168,13 @@ ber_peek_tag(
         */
 
        char *save;
-       ber_tag_t       tag;
+       ber_tag_t       tag, old;
 
+       old = ber->ber_tag;
        save = ber->ber_ptr;
        tag = ber_skip_tag( ber, len );
        ber->ber_ptr = save;
+       ber->ber_tag = old;
 
        return tag;
 }
@@ -213,6 +222,7 @@ ber_getnint(
        } else {
                *num = 0;
        }
+       ber->ber_tag = *ber->ber_ptr;
 
        return len;
 }
@@ -271,6 +281,7 @@ ber_get_stringb(
        if ( (ber_len_t) ber_read( ber, buf, datalen ) != datalen ) {
                return LBER_DEFAULT;
        }
+       ber->ber_tag = *ber->ber_ptr;
 
        buf[datalen] = '\0';
 
@@ -423,6 +434,7 @@ ber_get_stringbv( BerElement *ber, struct berval *bv )
                return LBER_DEFAULT;
        }
        bv->bv_val[bv->bv_len] = '\0';
+       ber->ber_tag = *ber->ber_ptr;
 
        return tag;
 }
@@ -499,6 +511,7 @@ ber_get_bitstringa(
                *buf = NULL;
                return LBER_DEFAULT;
        }
+       ber->ber_tag = *ber->ber_ptr;
 
        *blen = datalen * 8 - unusedbits;
        return tag;
@@ -520,6 +533,7 @@ ber_get_null( BerElement *ber )
        if ( len != 0 ) {
                return LBER_DEFAULT;
        }
+       ber->ber_tag = *ber->ber_ptr;
 
        return( tag );
 }
@@ -558,6 +572,7 @@ ber_first_element(
                *last = NULL;
                return LBER_DEFAULT;
        }
+       ber->ber_tag = *ber->ber_ptr;
 
        *last = ber->ber_ptr + *len;
 
@@ -743,6 +758,7 @@ ber_scanf ( BerElement *ber,
                        if ( (rc = ber_skip_tag( ber, &len )) == LBER_DEFAULT )
                                break;
                        ber->ber_ptr += len;
+                       ber->ber_tag = *ber->ber_ptr;
                        break;
 
                case '{':       /* begin sequence */
index 578f42be094a9deff9a57fed64483937a7794720..6cc1505c5a4bcb9958a3862273ee86aa71ff40cd 100644 (file)
@@ -594,7 +594,7 @@ fill_buffer:
        }
 
        if (ber->ber_buf==NULL) {
-               ber->ber_buf = (char *) LBER_MALLOC( ber->ber_len );
+               ber->ber_buf = (char *) LBER_MALLOC( ber->ber_len + 1 );
                if (ber->ber_buf==NULL) {
                        return LBER_DEFAULT;
                }