[net.lang.c] octal character constants

jeff@warwick.UUCP (Jeff Smith) (04/10/86)

There is a comment in the C++ Release 1 translator
        sizeof("\01") a syntax error                 (c_strlen in size.c)
The relevant part of K+R says:

        `The escape \ddd consists of the backslash followed by 1, 2, or
3 octal digits which are taken to specify the value of the desired character.
A special case of this construction is \0 (not followed by a digit), which
indicates the character NUL.'   (p181)

Bjarne's manual says the same. (p246)

I claim that the string "p\01q" is legal, has four characters in it (p, SOH,
q and NUL) and will be passed through as is by cfront (whereas \xddd (c++ hex
feature) constructs will always generate escape sequences with the full three
digits). In which case c_strlen should be replaced by the following code:

#ifdef	OCTALDDDFIX
#include <ctype.h>
static inline
isoctal(char c) {
	return (isascii(c) && isdigit(c) && c != '9' && c != '8');
}

int c_strlen(char* s) {
	int i = 1;
        for (register char* p = s; *p; i++,p++)
		if (*p == '\\')	{
			if (isoctal(*++p)) {
				if (! isoctal(*++p))
					p--;
				else if (! isoctal(*++p))
				     	p--;
			}
		}
	return i;
}
#else	!OCTALDDDFIX

int c_strlen(char* s)
/*
	return sizeof(s) with escapes processed
	sizeof("") == 1		the terminating 0
	sizeof("a") == 2
	sizeof("\0x") == 3	0 x 0
	sizeof("\012") == 2	'\012'
	sizeof("\01") a syntax error
	sizeof("\x") == 2 	\ ignored

*/
{
        /*
           old body, not quoted here lest the ghost of Old Ma Bell
           haunt me forever
         */
}
#endif	OCTALDDDFIX

Or maybe Bjarne intended the chconst code in lex.c to translate all
character constants to three-digit form. Bjarne?

--------------------------------------
...mcvax!warwick!jeff           (uucp)
..jeff%warwick.uucp@ucl-cs.arpa (arpa)