⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ber_int.c

📁 harvest是一个下载html网页得机器人
💻 C
字号:
/* * Copyright (c) 1995-2003, Index Data * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Id: ber_int.c,v 1.22 2003/03/11 11:03:31 adam Exp $ */#if HAVE_CONFIG_H#include <config.h>#endif#include <string.h>#ifdef WIN32#include <winsock.h>#else#include <sys/types.h>#include <netinet/in.h>#endif#include "odr-priv.h"static int ber_encinteger(ODR o, int val);static int ber_decinteger(const unsigned char *buf, int *val, int max);int ber_integer(ODR o, int *val){    int res;    switch (o->direction)    {        case ODR_DECODE:            if ((res = ber_decinteger(o->bp, val, odr_max(o))) <= 0)            {                odr_seterror(o, OPROTO, 50);                return 0;            }            o->bp += res;            return 1;        case ODR_ENCODE:            if ((res = ber_encinteger(o, *val)) < 0)                return 0;            return 1;        case ODR_PRINT: return 1;        default: odr_seterror(o, OOTHER, 51);  return 0;    }}/* * Returns: number of bytes written or -1 for error (out of bounds). */int ber_encinteger(ODR o, int val){    int a, len;    union { int i; unsigned char c[sizeof(int)]; } tmp;    tmp.i = htonl(val);   /* ensure that that we're big-endian */    for (a = 0; a < (int) sizeof(int) - 1; a++)  /* skip superfluous octets */        if (!((tmp.c[a] == 0 && !(tmp.c[a+1] & 0X80)) ||            (tmp.c[a] == 0XFF && (tmp.c[a+1] & 0X80))))            break;    len = sizeof(int) - a;    if (ber_enclen(o, len, 1, 1) != 1)        return -1;    if (odr_write(o, (unsigned char*) tmp.c + a, len) < 0)        return -1;#ifdef ODR_DEBUG    fprintf(stderr, "[val=%d]", val);#endif    return 0;}/* * Returns: Number of bytes read or 0 if no match, -1 if error. */int ber_decinteger(const unsigned char *buf, int *val, int max){    const unsigned char *b = buf;    unsigned char fill;    int res, len, remains;    union { int i; unsigned char c[sizeof(int)]; } tmp;    if ((res = ber_declen(b, &len, max)) < 0)        return -1;    if (len+res > max || len < 0) /* out of bounds or indefinite encoding */        return -1;      if (len > (int) sizeof(int))  /* let's be reasonable, here */        return -1;    b+= res;    remains = sizeof(int) - len;    memcpy(tmp.c + remains, b, len);    if (*b & 0X80)        fill = 0XFF;    else        fill = 0X00;    memset(tmp.c, fill, remains);    *val = ntohl(tmp.i);    b += len;#ifdef ODR_DEBUG    fprintf(stderr, "[val=%d]", *val);#endif    return b - buf;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -