eck преди 34 години
родител
ревизия
d796fe1f4e
променени са 3 файла, в които са добавени 361 реда и са изтрити 1 реда
  1. 1 0
      doc/.distr
  2. 3 1
      doc/Makefile
  3. 357 0
      doc/ansi_C.doc

+ 1 - 0
doc/.distr

@@ -4,6 +4,7 @@ ack.doc
 basic.doc
 cg.doc
 crefman.doc
+ansi_C.doc
 em
 install.doc
 install.pr

+ 3 - 1
doc/Makefile

@@ -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 - 0
doc/ansi_C.doc

@@ -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