added ANSI-C document
This commit is contained in:
parent
8d7a5dba0a
commit
069d94c39b
3 changed files with 361 additions and 1 deletions
|
@ -4,6 +4,7 @@ ack.doc
|
|||
basic.doc
|
||||
cg.doc
|
||||
crefman.doc
|
||||
ansi_C.doc
|
||||
em
|
||||
install.doc
|
||||
install.pr
|
||||
|
|
|
@ -13,7 +13,7 @@ TARGET=-Tlp
|
|||
RESFILES= \
|
||||
toolkit.$(SUF) install.$(SUF) em.$(SUF) ack.$(SUF) v7bugs.$(SUF) \
|
||||
peep.$(SUF) cg.$(SUF) ncg.$(SUF) regadd.$(SUF) LLgen.$(SUF) \
|
||||
basic.$(SUF) crefman.$(SUF) pcref.$(SUF) val.$(SUF) \
|
||||
basic.$(SUF) crefman.$(SUF) pcref.$(SUF) val.$(SUF) ansi_C.$(SUF) \
|
||||
6500.$(SUF) i80.$(SUF) z80.$(SUF) top.$(SUF) ego.$(SUF) \
|
||||
m68020.$(SUF) occam.$(SUF) m2ref.$(SUF) ceg.$(SUF) nopt.$(SUF)
|
||||
|
||||
|
@ -24,6 +24,8 @@ RESFILES= \
|
|||
|
||||
crefman.$(SUF): crefman.doc
|
||||
$(EQN) $(TARGET) crefman.doc | $(NROFF) $(MS) $(TARGET) >$@
|
||||
ansi_C.$(SUF): ansi_C.doc
|
||||
$(TBL) $(TARGET) ansi_C.doc | $(NROFF) $(MS) $(TARGET) >$@
|
||||
v7bugs.$(SUF): v7bugs.doc
|
||||
$(NROFF) $(TARGET) v7bugs.doc >$@
|
||||
install.$(SUF): install.doc
|
||||
|
|
357
doc/ansi_C.doc
Executable file
357
doc/ansi_C.doc
Executable file
|
@ -0,0 +1,357 @@
|
|||
.de NS
|
||||
.sp
|
||||
.in 0
|
||||
\\fBANS \\$1:\\fP
|
||||
..
|
||||
.TL
|
||||
Amsterdam Compiler Kit-ANSI C compiler compliance statements
|
||||
.AU
|
||||
Hans van Eck
|
||||
.AI
|
||||
Dept. of Mathematics and Computer Science
|
||||
Vrije Universiteit
|
||||
Amsterdam, The Netherlands
|
||||
.PP
|
||||
This document specifies the implementation-defined behaviour of the ANSI-C
|
||||
frontend of the Amsterdam Compiler Kit as required by ANS X3.159-1989. Since
|
||||
the implementation-defined behaviour sometimes depends on the machine
|
||||
compiling on or for, some items will be left unspecified in this
|
||||
document\(dg.
|
||||
.FS
|
||||
\(dg when cross-compiling, run-time behaviour may be different from
|
||||
compile-time behaviour
|
||||
.FE
|
||||
The compiler assumes that it runs on a UNIX system.
|
||||
.NS A.6.3.1
|
||||
.IP -
|
||||
Diagnostics are placed on the standard error output. They have the
|
||||
following specification:
|
||||
.br
|
||||
"<file>", line <nr>: [(<class>)] <diagnostic>
|
||||
.br
|
||||
There are three classes of diagnostics: "error", "strict" and "warning".
|
||||
When the class is "error", the <class> is absent.
|
||||
.br
|
||||
The class "strict" is used for violations of the standard which are
|
||||
not severe enough to stop compilation. An example is the the occurrence
|
||||
of non white-space after an '#else' or '#endif' pre-processing
|
||||
directive. The class "warning" is used for legal but dubious
|
||||
constructions. An example is overflow of constant expressions.
|
||||
.NS A.6.3.2
|
||||
.IP -
|
||||
The function 'main' can have two arguments. The first argument is an
|
||||
integer specifying the number of arguments on the command line. The second
|
||||
argument is a pointer to an array of pointers to the arguments (as
|
||||
strings).
|
||||
.IP -
|
||||
Interactive devices are terminals.
|
||||
.NS A.6.3.3
|
||||
.IP -
|
||||
The number of significant characters is an option. By default it is 64.
|
||||
There is a distinction between upper- and lowercase.
|
||||
.NS A.6.3.4
|
||||
.IP -
|
||||
The compiler assumes ASCII-characters in both the source and execution
|
||||
character set.
|
||||
.IP -
|
||||
There are no multi-byte characters.
|
||||
.IP -
|
||||
There 8 bits in a character.
|
||||
.IP -
|
||||
Character constants with values that can't be represented in 8 bits
|
||||
are truncated.
|
||||
.IP -
|
||||
Character constants that are more than 1 character wide will have the
|
||||
first character specified in the least significant byte.
|
||||
.IP -
|
||||
The only supported locale is "C".
|
||||
.IP -
|
||||
A plain 'char' has the same range of values as 'signed char'.
|
||||
.NS A.6.3.5
|
||||
.IP -
|
||||
The compiler assumes that it works on and compiles for a
|
||||
2-complement binary-number system. Shorts will use 2 bytes and longs
|
||||
will use 4 bytes. The size of integers are machine dependent.
|
||||
.IP -
|
||||
Converting an integer to a shorter signed integer is implemented by
|
||||
ignoring the high-order byte(s) of the former.
|
||||
Converting a unsigned integer to a signed integer of the same type is
|
||||
only done in administration. This means that the bit-pattern remains
|
||||
unchanged.
|
||||
.IP -
|
||||
The result of bitwise operations on signed integers are what can be
|
||||
expected on a 2-complement machine.
|
||||
.IP -
|
||||
The sign of the remainder on integer division is machine dependent.
|
||||
.IP -
|
||||
The right-shift of a negative value is negative.
|
||||
.NS A.6.3.6
|
||||
.IP -
|
||||
The representation of floating-point values is machine-dependent.
|
||||
When native floating-point isn't present an IEEE-emulation is used.
|
||||
The compiler uses high-precision floating-point for constant folding.
|
||||
.IP -
|
||||
Truncation is always to the nearest floating-point number that can
|
||||
be represented.
|
||||
.NS A.6.3.7
|
||||
.IP -
|
||||
When a pointer is as large as an integer, the type of the sizeof-operator is
|
||||
'unsigned int', otherwise it is 'unsigned long'. The compiler will not
|
||||
run when a pointer fits in neither.
|
||||
.IP -
|
||||
Casting an integer to a pointer or vice versa has no effect in
|
||||
bit-pattern when the sizes are equal. Otherwise the value will be
|
||||
truncated or zero-extended (depending on the direction of the
|
||||
conversion and the relative sizes).
|
||||
.IP -
|
||||
When a pointer is as large as an integer, the type of a 'ptrdiff_t' will
|
||||
be 'int'. Otherwise the type will be 'long'.
|
||||
.NS A.6.3.8
|
||||
.IP -
|
||||
Since the frontend has only limited control over the registers, it can
|
||||
only make it more likely that variables that are declared as
|
||||
registers also end up in registers. The only things that can possibly be
|
||||
put into registers are : 'int', 'long', 'float', 'double', 'long double'
|
||||
and pointers.
|
||||
.NS A.6.3.9
|
||||
.IP -
|
||||
When a member of a union object is accessed using a member of a
|
||||
different type, the resulting value will usually be garbage. The
|
||||
compiler makes no effort to catch these errors.
|
||||
.IP -
|
||||
The alignment of types is a compile-time option. The alignment of
|
||||
a structure-member is the alignment of it's type. Usually, the
|
||||
alignment is passed on to the compiler by the 'ack' program. When a
|
||||
user wants to do this manually, he/she should be prepared for trouble.
|
||||
.IP -
|
||||
A "plain" 'int' bit-field is taken as a 'signed int'. This means that
|
||||
a field with size 1 can only store the values 0 and -1.
|
||||
.IP -
|
||||
The order of allocation of bit-fields is a compile-time option. By
|
||||
default, high-order bits are allocated first.
|
||||
.IP -
|
||||
An enum has the same size as a "plain" 'int'.
|
||||
.NS A.6.3.10
|
||||
.IP -
|
||||
An access to a volatile object is either a load or a store. Just
|
||||
mentioning a volatile variable is not enough.
|
||||
E.g. the statement "x;" where x is declared volatile, does not
|
||||
constitute an access. When a volatile object should be read, but its
|
||||
value ignored, "if (x);" should do the trick.
|
||||
.NS A.6.3.11
|
||||
.IP -
|
||||
There is no fixed limit on the number of declarators that may modify an
|
||||
arithmetic, structure or union type, although specifying too many may
|
||||
cause the compiler ro run out of memory.
|
||||
.NS A.6.3.12
|
||||
.IP -
|
||||
The maximum number of cases in a switch-statement is in the order of
|
||||
1e9, although the compile may run out of memory somewhat earlier.
|
||||
.NS A.6.3.13
|
||||
.IP -
|
||||
Since both the pre-processor and the compiler assume ASCII-characters,
|
||||
a single character constant in a conditional-inclusion directive
|
||||
matches the same value in the execution character set.
|
||||
.IP -
|
||||
The pre-processor recognizes -I... command-line options. The
|
||||
directories thus specified are searched first. After that, depending on the
|
||||
command that the preprocessor is call with, machine/system-dependant
|
||||
directories are searched. After that, ~em/include/_tail_ac and
|
||||
/usr/include are visited.
|
||||
.IP -
|
||||
Quoted names are looked for in the directory in which the file currently
|
||||
being compiled resides.
|
||||
.IP -
|
||||
The characters in a h- or q- char-sequence are taken to be UNIX
|
||||
paths.
|
||||
.IP -
|
||||
Neither the compiler nor the preprocessor know any pragma's.
|
||||
.IP -
|
||||
Since the compiler runs on UNIX, __DATE__ and __TIME__ will always be
|
||||
defined.
|
||||
.NS A.6.3.14
|
||||
.IP -
|
||||
NULL is defined as ((void *)0). This in order to flag dubious
|
||||
constructions like "int x = NULL;".
|
||||
.IP -
|
||||
The diagnostic printed by 'assert' is as follows:
|
||||
.ti +4n
|
||||
"Assertion "<expr>" failed, file "<file>", line <line>",
|
||||
.br
|
||||
where <expr> is the argument to the assert macro, printed as string.
|
||||
(the <file> and <line> should be clear)
|
||||
.IP -
|
||||
The sets for character test macro's.
|
||||
.TS
|
||||
l l.
|
||||
name: set:
|
||||
isalnum() 0-9A-Za-z
|
||||
isalpha() A-Za-z
|
||||
iscntrl() \e000-\e037\e177
|
||||
islower() a-z
|
||||
isupper() A-Z
|
||||
isprint() <space>-~ (== \e040-\e176)
|
||||
.TE
|
||||
.IP -
|
||||
The behaviour of mathematic functions on domain error:
|
||||
.TS
|
||||
l c
|
||||
l n.
|
||||
name: returns:
|
||||
asin() 0.0
|
||||
acos() 0.0
|
||||
atan2() 0.0
|
||||
fmod() 0.0
|
||||
log() -HUGE_VAL
|
||||
log10() -HUGE_VAL
|
||||
pow() 0.0
|
||||
sqrt() 0.0
|
||||
.TE
|
||||
.IP -
|
||||
Underflow range errors do not cause errno to be set.
|
||||
.IP -
|
||||
The function fmod() returns 0.0 and sets errno to EDOM when the second
|
||||
argument is 0.0.
|
||||
.IP -
|
||||
The set of signals for the signal() function depends on the UNIX-system
|
||||
which the compiler is compiling for. The default handling, semantics
|
||||
and behaviour of these signals are those specified by the operating
|
||||
system vendor. The default handling is not reset when SIGILL is
|
||||
received.
|
||||
.IP -
|
||||
A text-stream need not end in a new-line character.
|
||||
.IP -
|
||||
White space characters before a new-line appear when read in.
|
||||
.IP -
|
||||
There may be any number of null characters appended to a binary
|
||||
stream.
|
||||
.IP -
|
||||
The file position indicator of an append mode stream is initially
|
||||
positioned at the beginning of the file.
|
||||
.IP -
|
||||
A write on a text stream does not cause the associated file to be
|
||||
truncated beyond that point.
|
||||
.IP -
|
||||
The buffering intended by the standard is fully supported.
|
||||
.IP -
|
||||
A zero-length file actually exists.
|
||||
.IP -
|
||||
A filename can consist of any character, except for the '\e0' and
|
||||
the '\e'.
|
||||
.IP -
|
||||
A file can be open multiple times.
|
||||
.IP -
|
||||
When a remove() is done on an open file, reading and writing behave
|
||||
just as can be expected from a non-removed file. When the associated
|
||||
stream is closed, all written data will be lost.
|
||||
.IP -
|
||||
When a file exists prior to a call to rename(), the behaviour is that
|
||||
of the underlying UNIX system. Normally, the call would fail.
|
||||
.IP -
|
||||
The %p conversion in fprintf() has the same effect as %#x or %#lx,
|
||||
depending on the sizes of pointer and integer.
|
||||
.IP -
|
||||
The %p conversion in fscanf() has the same effect as %x or %lx,
|
||||
depending on the sizes of pointer and integer.
|
||||
.IP -
|
||||
A - character that is neither the first nor the last character in the
|
||||
scanlist for %[ conversion is taken to be a range indicator. When the
|
||||
first character has a higher ASCII-value than the second, the - will
|
||||
just be put into the scanlist.
|
||||
.IP -
|
||||
The value of errno is that of lseek(). This means:
|
||||
.RS
|
||||
.IP "EBADF \-" 10
|
||||
when the stream isn't valid
|
||||
.IP "ESPIPE \-"
|
||||
when fildes is associated with a pipe (and on some systems: sockets)
|
||||
.IP "EINVAL \-"
|
||||
the resulting file pointer would be negative
|
||||
.RE
|
||||
.LP
|
||||
.IP -
|
||||
The messages generated by perror() depend on the value of errno.
|
||||
The mapping of errors to strings is done by strerror().
|
||||
.IP -
|
||||
When the requested size is zero, malloc(), calloc() and realloc()
|
||||
return a null-pointer.
|
||||
.IP -
|
||||
When abort() is called, output buffers will be flushed. Temporary files
|
||||
(made with the tmpfile() function) will have disappeared when SIGABRT
|
||||
is not caught or ignored.
|
||||
.IP -
|
||||
The exit() function returns the low-order eight bits of it's argument
|
||||
to the environment.
|
||||
.IP -
|
||||
The predefined environment names are controlled by the user.
|
||||
Setting environment variables is done through the putenv() function.
|
||||
This function accepts a pointer to char as it's argument.
|
||||
To set f.i. the environment variable TERM to a230 one writes
|
||||
.ti +4n
|
||||
putenv("TERM=a230");
|
||||
.br
|
||||
The argument to putenv() is stored in an internal table, so malloc'ed
|
||||
strings can't be freed until another call to putenv() (wich set's the
|
||||
same environment variable) is made. The function returns 1 if it fails,
|
||||
0 otherwise.
|
||||
.LP
|
||||
.IP -
|
||||
The argument to system is passed as argument to /bin/sh -c.
|
||||
.IP -
|
||||
The strings returned by strerror() depend on errno in the following
|
||||
way:
|
||||
.TS
|
||||
l l.
|
||||
errno string
|
||||
0 "Error 0",
|
||||
EPERM "Not owner",
|
||||
ENOENT "No such file or directory",
|
||||
ESRCH "No such process",
|
||||
EINTR "Interrupted system call",
|
||||
EIO "I/O error",
|
||||
ENXIO "No such device or address",
|
||||
E2BIG "Arg list too long",
|
||||
ENOEXEC "Exec format error",
|
||||
EBADF "Bad file number",
|
||||
ECHILD "No children",
|
||||
EAGAIN "No more processes",
|
||||
ENOMEM "Not enough core",
|
||||
EACCES "Permission denied",
|
||||
EFAULT "Bad address",
|
||||
ENOTBLK "Block device required",
|
||||
EBUSY "Mount device busy",
|
||||
EEXIST "File exists",
|
||||
EXDEV "Cross-device link",
|
||||
ENODEV "No such device",
|
||||
ENOTDIR "Not a directory",
|
||||
EISDIR "Is a directory",
|
||||
EINVAL "Invalid argument",
|
||||
ENFILE "File table overflow",
|
||||
EMFILE "Too many open files",
|
||||
ENOTTY "Not a typewriter",
|
||||
ETXTBSY "Text file busy",
|
||||
EFBUG "File too large",
|
||||
ENOSPC "No space left on device",
|
||||
ESPIPE "Illegal seek",
|
||||
EROFS "Read-only file system",
|
||||
EMLINK "Too many links",
|
||||
EPIPE "Broken pipe",
|
||||
EDOM "Math argument",
|
||||
ERANGE "Result too large"
|
||||
.TE
|
||||
everything else causes strerror() to return "unknown error"
|
||||
.IP -
|
||||
The local timezone is per default MET (GMT + 1:00:00). This can be
|
||||
changed through the TZ environment variable, or by some changes in the
|
||||
sources.
|
||||
.IP -
|
||||
The clock() function returns the number of ticks since process
|
||||
startup.
|
||||
.SH
|
||||
References
|
||||
.IP [1]
|
||||
ANS X3.159-1989
|
||||
.I
|
||||
American National Standard for Information Systems -
|
||||
Programming Language C
|
||||
.R
|
Loading…
Reference in a new issue