Ejemplo n.º 1
0
/*
 * 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);
}
Ejemplo n.º 2
0
/*
 * 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);
}
Ejemplo n.º 3
0
/*
 * 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);
}
Ejemplo n.º 4
0
/*
 * 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);
}
Ejemplo n.º 5
0
Archivo: main.c Proyecto: cwchentw/base
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;
}