00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef _ber_h
00010 #define _ber_h
00011
00012 #include <stdio.h>
00013 #include <errno.h>
00014
00015 typedef unsigned int ber_t;
00016
00017 #define BER_MAX_BYTES (sizeof(ber_t) + 1)
00018
00019 inline int ber_buf2value(const unsigned char* buf, int buf_len, ber_t& result) {
00020 result = 0;
00021 unsigned int bits = 0;
00022 int length = 1;
00023 while(*buf & 0x80) {
00024 if(bits > sizeof(ber_t) * 8) return EINVAL;
00025 result |= (*buf & 0x7f) << bits;
00026 bits += 7;
00027 buf++;
00028 length++;
00029 if(length > buf_len) return EINVAL;
00030 }
00031 result |= (*buf & 0x7f) << bits;
00032
00033 return length;
00034 }
00035
00036 inline int ber_file2value(FILE* fp, ber_t& result) {
00037 result = 0;
00038 unsigned int bits = 0;
00039 int c;
00040 int length = 1;
00041 while((c = fgetc(fp)) != EOF && (c & 0x80)) {
00042 if(bits > sizeof(ber_t) * 8) return EINVAL;
00043 result |= (c & 0x7f) << bits;
00044 bits += 7;
00045 length++;
00046 }
00047
00048 if(c == EOF) return EINVAL;
00049
00050 result |= (c & 0x7f) << bits;
00051
00052 return length;
00053 }
00054
00055 inline int ber_value2buf(unsigned char* buf, int buf_len, ber_t value)
00056 {
00057 if(buf_len <= 0) return EINVAL;
00058 int buf_idx = 0;
00059 buf[buf_idx++] = (value & 0x7f);
00060 while(value >>= 7) {
00061 if(buf_idx >= buf_len) return EINVAL;
00062 buf[buf_idx - 1] |= 0x80;
00063 buf[buf_idx++] = (value & 0x7f);
00064 }
00065 return buf_idx;
00066 }
00067
00068 inline int ber_value2file(FILE* fp, ber_t value)
00069 {
00070 int length = 1;
00071 unsigned char current;
00072 current = (value & 0x7f);
00073 while(value >>= 7) {
00074 current |= 0x80;
00075 if(fputc(current, fp) == EOF) return EINVAL;
00076 current = (value & 0x7f);
00077 length++;
00078 }
00079
00080 if(fputc(current, fp) == EOF) return EINVAL;
00081
00082 return length;
00083 }
00084
00085 #endif