/* * Receive a packet. */ static int kgdb_recv(u_char *bp, int maxlen) { u_char *p; int c, csum, tmpcsum; int len; DPRINTF(("kgdb_recv: ")); do { p = bp; csum = len = 0; while ((c = GETC()) != KGDB_START) DPRINTF(("%c",c)); DPRINTF(("%c Start ",c)); while ((c = GETC()) != KGDB_END && len < maxlen) { DPRINTF(("%c",c)); c &= 0x7f; csum += c; *p++ = c; len++; } csum &= 0xff; *p = '\0'; DPRINTF(("%c End ", c)); if (len >= maxlen) { DPRINTF(("Long- ")); PUTC(KGDB_BADP); continue; } tmpcsum = csum; c = GETC(); DPRINTF(("%c",c)); csum -= digit2i(c) * 16; c = GETC(); DPRINTF(("%c",c)); csum -= digit2i(c); if (csum == 0) { DPRINTF(("Good+ ")); PUTC(KGDB_GOODP); /* Sequence present? */ if (bp[2] == ':') { DPRINTF(("Seq %c%c ", bp[0], bp[1])); PUTC(bp[0]); PUTC(bp[1]); len -= 3; kgdb_copy(bp + 3, bp, len); } break; } DPRINTF((" Bad(wanted %x, off by %d)- ", tmpcsum, csum)); __USE(tmpcsum); PUTC(KGDB_BADP); } while (1); DPRINTF(("kgdb_recv: %s\n", bp)); return (len); }
/* * Receive a packet. */ static int kgdb_recv(u_char *bp, int maxlen) { u_char *p; int c, csum; int len; do { p = bp; csum = len = 0; while ((c = GETC()) != KGDB_START) ; while ((c = GETC()) != KGDB_END && len < maxlen) { c &= 0x7f; csum += c; *p++ = c; len++; } csum &= 0xff; *p = '\0'; if (len >= maxlen) { PUTC(KGDB_BADP); continue; } csum -= digit2i(GETC()) * 16; csum -= digit2i(GETC()); if (csum == 0) { PUTC(KGDB_GOODP); /* Sequence present? */ if (bp[2] == ':') { PUTC(bp[0]); PUTC(bp[1]); len -= 3; kgdb_copy(bp + 3, bp, len); } break; } PUTC(KGDB_BADP); } while (1); #ifdef DEBUG_KGDB printf("kgdb_recv: %s\n", bp); #endif return (len); }
/* * Convert an hex string into a byte array. * This returns a pointer to the character following * the last valid hex digit. If the string ends in * the middle of a byte, NULL is returned. */ static u_char * hex2mem(void *vdst, u_char *src, int maxlen) { u_char *dst = vdst; int msb, lsb; while (*src && maxlen--) { msb = digit2i(*src++); if (msb < 0) return (src - 1); lsb = digit2i(*src++); if (lsb < 0) return (NULL); *dst++ = (msb << 4) | lsb; } return (src); }
/* * Convert an hex string into an integer. * This returns a pointer to the character following * the last valid hex digit. */ static vaddr_t hex2i(u_char **srcp) { char *src = *srcp; vaddr_t r = 0; int nibble; while ((nibble = digit2i(*src)) >= 0) { r *= 16; r += nibble; src++; } *srcp = src; return (r); }
int main(int argc, char *argv[]) { if (argc < 3 || argc > 4) { fprintf(stderr, "Usage: %s number from_base to_base\n", argv[0]); fprintf(stderr, " from_base is optional, default to 10\n"); exit(EXIT_FAILURE); } long long int from_base = 0; long long int to_base = 0; char *fromBasePtr; char *toBasePtr; if (argc == 3) { from_base = 10; to_base = strtoll(argv[2], &toBasePtr, 10); if (*toBasePtr) { fprintf(stderr, "Invalid to_base number %s\n", argv[2]); exit(EXIT_FAILURE); } } else if (argc == 4) { from_base = strtoll(argv[2], &fromBasePtr, 10); if (*fromBasePtr) { fprintf(stderr, "Invalid from_base number %s\n", argv[2]); exit(EXIT_FAILURE); } to_base = strtoll(argv[3], &toBasePtr, 10); if (*toBasePtr) { fprintf(stderr, "Invalid to_base number %s\n", argv[3]); exit(EXIT_FAILURE); } } if (from_base < 2 || from_base > 36) { fprintf(stderr, "Invalid from_base number %lli\n", from_base); exit(EXIT_FAILURE); } if (to_base < 2 || to_base > 36) { fprintf(stderr, "Invalid to_base number %lli\n", to_base); exit(EXIT_FAILURE); } gchar *number = argv[1]; long long int temp = 0; int carry = (int)strlen(number); long long int _num = 1; for (int i = carry - 1; i >= 0; i--) { int n = digit2i(number[i]); if (n < 0) { fprintf(stderr, "Error on digit2i\n"); exit(EXIT_FAILURE); } temp += n * _num; _num = _num * from_base; } gchar *output = NULL; // If temp is zero, do conversion one time. do { char c = i2digit(temp % to_base); char str[] = {c, '\0'}; if (c == '\0') { fprintf(stderr, "Error on i2digit\n"); g_free(output); exit(EXIT_FAILURE); } output = NULL == output ? g_strconcat(str, NULL) : g_strconcat(str, output, NULL); temp = temp / to_base; } while (temp); g_print("%s\n", output); g_free(output); return 0; }