Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1 6/24/83; site ut-ngp.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!godot!harvard!seismo!ut-sally!ut-ngp!bph From: bph@ut-ngp.UUCP (hine, butler) Newsgroups: net.lang.c Subject: Re: Roff in C and iscntrl() Message-ID: <1161@ut-ngp.UUCP> Date: Wed, 2-Jan-85 15:00:10 EST Article-I.D.: ut-ngp.1161 Posted: Wed Jan 2 15:00:10 1985 Date-Received: Fri, 4-Jan-85 00:39:58 EST Organization: U.Texas Computation Center, Austin, Texas Lines: 74 [] >> here's how the manual defines "iscntrl()": >> >> iscntrl c is a delete character (0177) or ordinary >> control character (less than 040). >> >> BOTH of the stated compilers [DeSmet C88 and CI-C86] >> failed to interpret "ordinary" in the same way >> as the PCC routine of the same name -- they return TRUE if the code is less >> than octal 040. As written, then, with this interpretation, newlines are >> never returned, and the text is lost. PCC, however, excludes newlines, >> backspace codes, carriage return codes and a few others, presumably because >> they are not "ordinary." >> >> This says something fairly awful about "portability." > This says something fairly awful about available C implementations! > > "ordinary" in the description of iscntrl is not an additional qualifier > but an explanatory one. iscntrl( c ) should return non-zero for c in > { 0, 1, ..., 036, 037, 0177 } and zero for c in > { 040, 041, ..., 0175, 0176 }. It is illegal to supply any other value > of c to the macro/function, although most implementations permit EOF (-1). If this is indeed correct, then the Portable C Compiler provided with 4.2bsd is guilty of a serious offence. I wrote a quick program to test it. Here is the program, and its output under 4.2bsd: ------------------------------------------------ #include#include main() { int c; for(c = 0; c <= '\040'; c++) { if(c == '\040') c = '\177'; printf("%03o ^%c %s", c, c+'@', (iscntrl(c)) ? "Yes" : " No"); (c&1) ? putchar('\n') : putchar('\t'); } } ------------------------------------------------- 000 ^@ Yes 001 ^A Yes 002 ^B Yes 003 ^C Yes 004 ^D Yes 005 ^E Yes 006 ^F Yes 007 ^G Yes 010 ^H Yes 011 ^I No 012 ^J No 013 ^K No 014 ^L No 015 ^M No 016 ^N Yes 017 ^O Yes 020 ^P Yes 021 ^Q Yes 022 ^R Yes 023 ^S Yes 024 ^T Yes 025 ^U Yes 026 ^V Yes 027 ^W Yes 030 ^X Yes 031 ^Y Yes 032 ^Z Yes 033 ^[ Yes 034 ^\ Yes 035 ^] Yes 036 ^^ Yes 037 ^_ Yes 177 ^? Yes > "PCC" has nothing to do with the ctype macros; they are defined in > /usr/include/ctype.h (or equivalent on non-UNIX) and usually use a table > loaded from the standard C library. It seems to me the manual page ought to tell you exactly what a subroutine returns. Clearly whoever made up the table decided codes 011-013 were NOT ordinary control codes. Other compilers (or their libraries) take the description of "iscntrl" above at face value, returning "Yes" for ALL of the codes listed above. You might try the above program on YOUR C compiler and see what happens.