Commit 58d4afec authored by Howard Chu's avatar Howard Chu
Browse files

Sync with HEAD

parent ee96d9c7
...@@ -663,6 +663,8 @@ scale( int new, lutil_int_decnum *prev, unsigned char *tmp ) ...@@ -663,6 +663,8 @@ scale( int new, lutil_int_decnum *prev, unsigned char *tmp )
* Output buffer must be provided, bv_len must indicate buffer size * Output buffer must be provided, bv_len must indicate buffer size
* Hex input can be "0x1234" or "'1234'H" * Hex input can be "0x1234" or "'1234'H"
* *
* Temporarily modifies the input string.
*
* Note: High bit of binary form is always the sign bit. If the number * Note: High bit of binary form is always the sign bit. If the number
* is supposed to be positive but has the high bit set, a zero byte * is supposed to be positive but has the high bit set, a zero byte
* is prepended. It is assumed that this has already been handled on * is prepended. It is assumed that this has already been handled on
...@@ -736,15 +738,16 @@ lutil_str2bin( struct berval *in, struct berval *out ) ...@@ -736,15 +738,16 @@ lutil_str2bin( struct berval *in, struct berval *out )
num.beg = num.bufsiz-1; num.beg = num.bufsiz-1;
num.len = 0; num.len = 0;
if ( pin[0] == '-' ) { if ( pin[0] == '-' ) {
neg = 1; neg = 0xff;
len--; len--;
pin++; pin++;
} }
#define DECMAX 8 /* 8 digits at a time */ #define DECMAX 8 /* 8 digits at a time */
if ( len > sizeof(tmpbuf)) { /* tmp must be at least as large as outbuf */
tmp = ber_memalloc( len ); if ( out->bv_len > sizeof(tmpbuf)) {
tmp = ber_memalloc( out->bv_len );
} else { } else {
tmp = tmpbuf; tmp = tmpbuf;
} }
...@@ -778,29 +781,14 @@ lutil_str2bin( struct berval *in, struct berval *out ) ...@@ -778,29 +781,14 @@ lutil_str2bin( struct berval *in, struct berval *out )
for ( i=0; i<num.len; i++ ) for ( i=0; i<num.len; i++ )
ptr[i] ^= 0xff; ptr[i] ^= 0xff;
/* Add 1, with carry */ /* add 1, with carry - overflow handled below */
i--; while ( i-- && ! (ptr[i] = (ptr[i] + 1) & 0xff )) ;
j = 1; }
for ( ; i>=0; i-- ) { /* Prepend sign byte if wrong sign bit */
j += ptr[i]; if (( num.buf[num.beg] ^ neg ) & 0x80 ) {
ptr[i] = j & 0xff;
j >>= 8;
if (!j)
break;
}
/* If we overflowed and there's still room,
* set an explicit sign byte
*/
if ( !( ptr[0] & 0x80 ) && num.beg ) {
num.beg--;
num.len++;
num.buf[num.beg] = 0x80;
}
} else if (( num.buf[num.beg] & 0x80 ) && num.beg ) {
/* positive int with high bit set, prepend 0 */
num.beg--; num.beg--;
num.len++; num.len++;
num.buf[num.beg] = 0; num.buf[num.beg] = neg;
} }
if ( num.beg ) if ( num.beg )
AC_MEMCPY( num.buf, num.buf+num.beg, num.len ); AC_MEMCPY( num.buf, num.buf+num.beg, num.len );
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment