📄 atob.c
字号:
/* $Id: atob.c,v 1.4 2002/08/10 13:05:17 pefo Exp $ *//* * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by Opsycon AB. * 4. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */#include <types.h>#include <string.h>#include <pmon.h>static char * _getbase __P((char *, int *));#ifdef HAVE_QUADstatic int _atob __P((unsigned long long *, char *p, int));#elsestatic int _atob __P((unsigned long *, char *, int));#endifstatic char *_getbase(char *p, int *basep){ if (p[0] == '0') { switch (p[1]) { case 'x': *basep = 16; break; case 't': case 'n': *basep = 10; break; case 'o': *basep = 8; break; default: *basep = 10; return (p); } return (p + 2); } *basep = 10; return (p);}/* * _atob(vp,p,base) */static int#ifdef HAVE_QUAD_atob (u_quad_t *vp, char *p, int base){ u_quad_t value, v1, v2;#else_atob (unsigned long *vp, char *p, int base){ u_long value, v1, v2;#endif char *q, tmp[20]; int digit; if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { base = 16; p += 2; } if (base == 16 && (q = strchr (p, '.')) != 0) { if (q - p > sizeof(tmp) - 1) return (0); strncpy (tmp, p, q - p); tmp[q - p] = '\0'; if (!_atob (&v1, tmp, 16)) return (0); q++; if (strchr (q, '.')) return (0); if (!_atob (&v2, q, 16)) return (0); *vp = (v1 << 16) + v2; return (1); } value = *vp = 0; for (; *p; p++) { if (*p >= '0' && *p <= '9') digit = *p - '0'; else if (*p >= 'a' && *p <= 'f') digit = *p - 'a' + 10; else if (*p >= 'A' && *p <= 'F') digit = *p - 'A' + 10; else return (0); if (digit >= base) return (0); value *= base; value += digit; } *vp = value; return (1);}/* * atob(vp,p,base) * converts p to binary result in vp, rtn 1 on success */intatob(u_int32_t *vp, char *p, int base){#ifdef HAVE_QUAD u_quad_t v;#else u_long v;#endif if (base == 0) p = _getbase (p, &base); if (_atob (&v, p, base)) { *vp = v; return (1); } return (0);}#ifdef HAVE_QUAD/* * llatob(vp,p,base) * converts p to binary result in vp, rtn 1 on success */intllatob(u_quad_t *vp, char *p, int base){ if (base == 0) p = _getbase (p, &base); return _atob(vp, p, base);}#endif/* * char *btoa(dst,value,base) * converts value to ascii, result in dst */char *btoa(char *dst, u_int value, int base){ char buf[34], digit; int i, j, rem, neg; if (value == 0) { dst[0] = '0'; dst[1] = 0; return (dst); } neg = 0; if (base == -10) { base = 10; if (value & (1L << 31)) { value = (~value) + 1; neg = 1; } } for (i = 0; value != 0; i++) { rem = value % base; value /= base; if (rem >= 0 && rem <= 9) digit = rem + '0'; else if (rem >= 10 && rem <= 36) digit = (rem - 10) + 'a'; buf[i] = digit; } buf[i] = 0; if (neg) strcat (buf, "-"); /* reverse the string */ for (i = 0, j = strlen (buf) - 1; j >= 0; i++, j--) dst[i] = buf[j]; dst[i] = 0; return (dst);}#ifdef HAVE_QUAD/* * char *btoa(dst,value,base) * converts value to ascii, result in dst */char *llbtoa(char *dst, u_quad_t value, int base){ char buf[66], digit; int i, j, rem, neg; if (value == 0) { dst[0] = '0'; dst[1] = 0; return (dst); } neg = 0; if (base == -10) { base = 10; if (value & (1LL << 63)) { value = (~value) + 1; neg = 1; } } for (i = 0; value != 0; i++) { rem = value % base; value /= base; if (rem >= 0 && rem <= 9) digit = rem + '0'; else if (rem >= 10 && rem <= 36) digit = (rem - 10) + 'a'; buf[i] = digit; } buf[i] = 0; if (neg) strcat (buf, "-"); /* reverse the string */ for (i = 0, j = strlen (buf) - 1; j >= 0; i++, j--) dst[i] = buf[j]; dst[i] = 0; return (dst);}#endif/* * gethex(vp,p,n) * convert n hex digits from p to binary, result in vp, * rtn 1 on success */intgethex(int32_t *vp, char *p, int n){ u_long v; int digit; for (v = 0; n > 0; n--) { if (*p == 0) return (0); if (*p >= '0' && *p <= '9') digit = *p - '0'; else if (*p >= 'a' && *p <= 'f') digit = *p - 'a' + 10; else if (*p >= 'A' && *p <= 'F') digit = *p - 'A' + 10; else return (0); v <<= 4; v |= digit; p++; } *vp = v; return (1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -