From cad5364599eb5062d59e0c397ed638ddd61a8d5d Mon Sep 17 00:00:00 2001 From: Manuel Novoa III Date: Wed, 19 Mar 2003 09:13:01 +0000 Subject: Major coreutils update. --- libbb/process_escape_sequence.c | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) (limited to 'libbb/process_escape_sequence.c') diff --git a/libbb/process_escape_sequence.c b/libbb/process_escape_sequence.c index 9a16f80ab..ef2717bdd 100644 --- a/libbb/process_escape_sequence.c +++ b/libbb/process_escape_sequence.c @@ -2,7 +2,7 @@ /* * Utility routines. * - * Copyright (C) Manuel Nova III + * Copyright (C) Manuel Novoa III * and Vladimir Oleynik * * This program is free software; you can redistribute it and/or modify @@ -26,9 +26,7 @@ #include #include "libbb.h" - - -char process_escape_sequence(const char **ptr) +char bb_process_escape_sequence(const char **ptr) { static const char charmap[] = { 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', 0, @@ -36,40 +34,43 @@ char process_escape_sequence(const char **ptr) const char *p; const char *q; - int num_digits; + unsigned int num_digits; + unsigned int r; unsigned int n; n = 0; q = *ptr; - for ( num_digits = 0 ; num_digits < 3 ; ++num_digits) { - if ((*q < '0') || (*q > '7')) { /* not a digit? */ - break; + num_digits = 0; + do { + if (((unsigned int)(*q - '0')) <= 7) { + r = n * 8 + (*q - '0'); + if (r <= UCHAR_MAX) { + n = r; + ++q; + if (++num_digits < 3) { + continue; + } + } } - n = n * 8 + (*q++ - '0'); - } + break; + } while (1); if (num_digits == 0) { /* mnemonic escape sequence? */ - for (p=charmap ; *p ; p++) { + p = charmap; + do { if (*p == *q) { q++; break; } - } + } while (*++p); n = *(p+(sizeof(charmap)/2)); } - /* doesn't hurt to fall through to here from mnemonic case */ - if (n > UCHAR_MAX) { /* is octal code too big for a char? */ - n /= 8; /* adjust value and */ - --q; /* back up one char */ - } - *ptr = q; return (char) n; } - /* END CODE */ /* Local Variables: -- cgit v1.2.3