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

📄 atob.c

📁 MIPS处理器的bootloader,龙芯就是用的修改过的PMON2
💻 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 + -