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

📄 a64l.c

📁 Newlib 嵌入式 C库 标准实现代码
💻 C
字号:
/*FUNCTION<<a64l>>, <<l64a>>---convert between radix-64 ASCII string and longINDEX        a64lINDEX	l64aANSI_SYNOPSIS        #include <stdlib.h>        long a64l(const char *<[input]>);        char *l64a(long <[input]>);TRAD_SYNOPSIS        #include <stdlib.h>        long a64l(<[input]>)        const char *<[input]>;        char *l64a(<[input]>)        long <[input]>;DESCRIPTIONConversion is performed between long and radix-64 characters.  The<<l64a>> routine transforms up to 32 bits of input value starting fromleast significant bits to the most significant bits.  The input valueis split up into a maximum of 5 groups of 6 bits and possibly onegroup of 2 bits (bits 31 and 30).Each group of 6 bits forms a value from 0--63 which is translated intoa character as follows:O+o     0 = '.'o     1 = '/'o     2--11 = '0' to '9'o     12--37 = 'A' to 'Z'o     38--63 = 'a' to 'z'O-When the remaining bits are zero or all bits have been translated, anull terminator is appended to the string.  An input value of 0results in the empty string.The <<a64l>> function performs the reverse translation.  Eachcharacter is used to generate a 6-bit value for up to 30 bits and thena 2-bit value to complete a 32-bit result.  The null terminator meansthat the remaining digits are 0.  An empty input string or NULL stringresults in 0L.  An invalid string results in undefined behavior.  Ifthe size of a long is greater than 32 bits, the result is sign-extended.RETURNS<<l64a>> returns a null-terminated string of 0 to 6 characters.<<a64l>> returns the 32-bit translated value from the input character string.PORTABILITY<<l64a>> and <<a64l>> are non-ANSI and are defined by the Single Unix Specification.Supporting OS subroutines required: None.*/#include <_ansi.h>#include <stdlib.h>#include <limits.h>long_DEFUN (a64l, (input),	const char *input){  const char *ptr;  char ch;  int i, digit;  unsigned long result = 0;  if (input == NULL)    return 0;  ptr = input;  /* it easiest to go from most significant digit to least so find end of input or up     to 6 characters worth */  for (i = 0; i < 6; ++i)    {      if (*ptr)	++ptr;    }  while (ptr > input)    {      ch = *(--ptr);#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)      if (ch >= 'a')	digit = (ch - 'a') + 38;      else if (ch >= 'A')	digit = (ch - 'A') + 12;      else if (ch >= '0')	digit = (ch - '0') + 2;      else if (ch == '/')	digit = 1;      else	digit = 0;#else /* !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) */      switch (ch)	{	case '/':	  digit = 1;	  break;	case '0':	case '1':	case '2':	case '3':	case '4':	case '5':	case '6':	case '7':	case '8':	case '9':	  digit = (ch - '0') + 2;	  break;	case 'A':	case 'B':	case 'C':	case 'D':	case 'E':	case 'F':	case 'G':	case 'H':	case 'I':	case 'J':	case 'K':	case 'L':	case 'M':	case 'N':	case 'O':	case 'P':	case 'Q':	case 'R':	case 'S':	case 'T':	case 'U':	case 'V':	case 'W':	case 'X':	case 'Y':	case 'Z':	  digit = (ch - 'A') + 12;	  break;	case 'a':	case 'b':	case 'c':	case 'd':	case 'e':	case 'f':	case 'g':	case 'h':	case 'i':	case 'j':	case 'k':	case 'l':	case 'm':	case 'n':	case 'o':	case 'p':	case 'q':	case 'r':	case 's':	case 't':	case 'u':	case 'v':	case 'w':	case 'x':	case 'y':	case 'z':	  digit = (ch - 'A') + 38;	  break;	default:	  digit = 0;	  break;	}#endif /* !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) */             result = (result << 6) + digit;    }#if LONG_MAX > 2147483647  /* for implementations where long is > 32 bits, the result must be sign-extended */  if (result & 0x80000000)      return (((long)-1 >> 32) << 32) + result;#endif  return result;}

⌨️ 快捷键说明

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