Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
782331f4
Commit
782331f4
authored
Apr 30, 1995
by
Per Bothner
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Bunch of fixes. See ChangeLog.
From-SVN: r9552
parent
7e2eb697
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
181 additions
and
92 deletions
+181
-92
gcc/cpplib.c
+181
-92
No files found.
gcc/cpplib.c
View file @
782331f4
...
@@ -70,7 +70,6 @@ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
...
@@ -70,7 +70,6 @@ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
#include <stdio.h>
#include <stdio.h>
#include <signal.h>
#include <signal.h>
#ifdef __STDC__
#ifdef __STDC__
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>
#endif
#endif
...
@@ -903,6 +902,11 @@ file_cleanup (pbuf, pfile)
...
@@ -903,6 +902,11 @@ file_cleanup (pbuf, pfile)
cpp_buffer
*
pbuf
;
cpp_buffer
*
pbuf
;
cpp_reader
*
pfile
;
cpp_reader
*
pfile
;
{
{
if
(
pbuf
->
buf
)
{
free
(
pbuf
->
buf
);
pbuf
->
buf
=
0
;
}
return
0
;
return
0
;
}
}
...
@@ -1035,6 +1039,9 @@ cpp_skip_hspace (pfile)
...
@@ -1035,6 +1039,9 @@ cpp_skip_hspace (pfile)
else
if
(
c
==
'\\'
&&
PEEKN
(
1
)
==
'\n'
)
{
else
if
(
c
==
'\\'
&&
PEEKN
(
1
)
==
'\n'
)
{
FORWARD
(
2
);
FORWARD
(
2
);
}
}
else
if
(
c
==
'@'
&&
CPP_BUFFER
(
pfile
)
->
has_escapes
&&
is_hor_space
[
PEEKN
(
1
)])
FORWARD
(
2
);
else
return
;
else
return
;
}
}
}
}
...
@@ -1276,18 +1283,18 @@ struct arglist {
...
@@ -1276,18 +1283,18 @@ struct arglist {
MACRONAME is the macro name itself (so we can avoid recursive expansion)
MACRONAME is the macro name itself (so we can avoid recursive expansion)
and NAMELEN is its length in characters.
and NAMELEN is its length in characters.
Note that comments and backslash-newlines have already been deleted
Note that comments, backslash-newlines, and leading white space
from the argument. */
have already been deleted
from the argument. */
static
DEFINITION
*
static
DEFINITION
*
collect_expansion
(
pfile
,
buf
,
end
,
nargs
,
arglist
)
collect_expansion
(
pfile
,
buf
,
limit
,
nargs
,
arglist
)
cpp_reader
*
pfile
;
cpp_reader
*
pfile
;
U_CHAR
*
buf
,
*
end
;
U_CHAR
*
buf
,
*
limit
;
int
nargs
;
int
nargs
;
struct
arglist
*
arglist
;
struct
arglist
*
arglist
;
{
{
DEFINITION
*
defn
;
DEFINITION
*
defn
;
register
U_CHAR
*
p
,
*
l
imit
,
*
l
astp
,
*
exp_p
;
register
U_CHAR
*
p
,
*
lastp
,
*
exp_p
;
struct
reflist
*
endpat
=
NULL
;
struct
reflist
*
endpat
=
NULL
;
/* Pointer to first nonspace after last ## seen. */
/* Pointer to first nonspace after last ## seen. */
U_CHAR
*
concat
=
0
;
U_CHAR
*
concat
=
0
;
...
@@ -1301,24 +1308,24 @@ collect_expansion (pfile, buf, end, nargs, arglist)
...
@@ -1301,24 +1308,24 @@ collect_expansion (pfile, buf, end, nargs, arglist)
thru the arg list on every potential symbol. Profiling might say
thru the arg list on every potential symbol. Profiling might say
that something smarter should happen. */
that something smarter should happen. */
if
(
end
<
buf
)
if
(
limit
<
buf
)
abort
();
abort
();
/* Find the beginning of the trailing whitespace. */
/* Find the beginning of the trailing whitespace. */
/* Find end of leading whitespace. */
limit
=
end
;
p
=
buf
;
p
=
buf
;
while
(
p
<
limit
&&
is_space
[
limit
[
-
1
]])
limit
--
;
while
(
p
<
limit
&&
is_space
[
limit
[
-
1
]])
limit
--
;
while
(
p
<
limit
&&
is_space
[
*
p
])
p
++
;
/* Allocate space for the text in the macro definition.
/* Allocate space for the text in the macro definition.
Leading and trailing whitespace chars need 2 bytes each.
Leading and trailing whitespace chars need 2 bytes each.
Each other input char may or may not need 1 byte,
Each other input char may or may not need 1 byte,
so this is an upper bound.
so this is an upper bound.
The extra 5 are for invented
The extra 2 are for invente
d trailing newline-marker and final null. */
leading an
d trailing newline-marker and final null. */
maxsize
=
(
sizeof
(
DEFINITION
)
maxsize
=
(
sizeof
(
DEFINITION
)
+
2
*
(
end
-
limit
)
+
2
*
(
p
-
buf
)
+
(
limit
-
p
)
+
5
);
+
(
limit
-
p
)
+
3
);
/* Occurrences of '@' get doubled, so allocate extra space for them. */
while
(
p
<
limit
)
if
(
*
p
++
==
'@'
)
maxsize
++
;
defn
=
(
DEFINITION
*
)
xcalloc
(
1
,
maxsize
);
defn
=
(
DEFINITION
*
)
xcalloc
(
1
,
maxsize
);
defn
->
nargs
=
nargs
;
defn
->
nargs
=
nargs
;
...
@@ -1327,7 +1334,9 @@ collect_expansion (pfile, buf, end, nargs, arglist)
...
@@ -1327,7 +1334,9 @@ collect_expansion (pfile, buf, end, nargs, arglist)
p
=
buf
;
p
=
buf
;
/* Add one initial space (often removed by macroexpand). */
/* Add one initial space escape-marker to prevent accidental
token-pasting (often removed by macroexpand). */
*
exp_p
++
=
'@'
;
*
exp_p
++
=
' '
;
*
exp_p
++
=
' '
;
if
(
limit
-
p
>=
2
&&
p
[
0
]
==
'#'
&&
p
[
1
]
==
'#'
)
{
if
(
limit
-
p
>=
2
&&
p
[
0
]
==
'#'
&&
p
[
1
]
==
'#'
)
{
...
@@ -1353,16 +1362,8 @@ collect_expansion (pfile, buf, end, nargs, arglist)
...
@@ -1353,16 +1362,8 @@ collect_expansion (pfile, buf, end, nargs, arglist)
expected_delimiter
=
c
;
expected_delimiter
=
c
;
break
;
break
;
/* Special hack: if a \# is written in the #define
include a # in the definition. This is useless for C code
but useful for preprocessing other things. */
case
'\\'
:
case
'\\'
:
/* \# quotes a # even outside of strings. */
if
(
p
<
limit
&&
expected_delimiter
)
{
if
(
p
<
limit
&&
*
p
==
'#'
&&
!
expected_delimiter
)
{
exp_p
--
;
*
exp_p
++
=
*
p
++
;
}
else
if
(
p
<
limit
&&
expected_delimiter
)
{
/* In a string, backslash goes through
/* In a string, backslash goes through
and makes next char ordinary. */
and makes next char ordinary. */
*
exp_p
++
=
*
p
++
;
*
exp_p
++
=
*
p
++
;
...
@@ -1523,16 +1524,14 @@ collect_expansion (pfile, buf, end, nargs, arglist)
...
@@ -1523,16 +1524,14 @@ collect_expansion (pfile, buf, end, nargs, arglist)
}
}
}
}
if
(
limit
<
end
)
{
if
(
!
CPP_TRADITIONAL
(
pfile
)
&&
expected_delimiter
==
0
)
while
(
limit
<
end
&&
is_space
[
*
limit
])
{
{
*
exp_p
++
=
*
limit
++
;
/* If ANSI, put in a "@ " marker to prevent token pasting.
But not if "inside a string" (which in ANSI mode
happens only for -D option). */
*
exp_p
++
=
'@'
;
*
exp_p
++
=
' '
;
}
}
}
else
if
(
!
CPP_TRADITIONAL
(
pfile
)
&&
expected_delimiter
==
0
)
{
/* There is no trailing whitespace, so invent some in ANSI mode.
But not if "inside a string" (which in ANSI mode
happens only for -D option). */
*
exp_p
++
=
' '
;
}
*
exp_p
=
'\0'
;
*
exp_p
=
'\0'
;
...
@@ -1671,8 +1670,7 @@ create_definition (buf, limit, pfile, predefinition)
...
@@ -1671,8 +1670,7 @@ create_definition (buf, limit, pfile, predefinition)
}
}
++
bp
;
/* skip paren */
++
bp
;
/* skip paren */
/* Skip exactly one space or tab if any. */
SKIP_WHITE_SPACE
(
bp
);
if
(
bp
<
limit
&&
(
*
bp
==
' '
||
*
bp
==
'\t'
))
++
bp
;
/* now everything from bp before limit is the definition. */
/* now everything from bp before limit is the definition. */
defn
=
collect_expansion
(
pfile
,
bp
,
limit
,
argno
,
arg_ptrs
);
defn
=
collect_expansion
(
pfile
,
bp
,
limit
,
argno
,
arg_ptrs
);
defn
->
rest_args
=
rest_args
;
defn
->
rest_args
=
rest_args
;
...
@@ -1944,7 +1942,6 @@ struct argdata {
...
@@ -1944,7 +1942,6 @@ struct argdata {
int
raw_length
,
expand_length
;
int
raw_length
,
expand_length
;
int
stringified_length
;
int
stringified_length
;
char
newlines
;
char
newlines
;
char
comments
;
char
use_count
;
char
use_count
;
};
};
...
@@ -2016,20 +2013,15 @@ cpp_scan_buffer (pfile)
...
@@ -2016,20 +2013,15 @@ cpp_scan_buffer (pfile)
}
}
/*
/*
* Rescan a string into pfile's buffer.
* Rescan a string
(which may have escape marks)
into pfile's buffer.
* Place the result in pfile->token_buffer.
* Place the result in pfile->token_buffer.
*
*
* The input is copied before it is scanned, so it is safe to pass
* The input is copied before it is scanned, so it is safe to pass
* it something from the token_buffer that will get overwritten
* it something from the token_buffer that will get overwritten
* (because it follows CPP_WRITTEN). This is used by do_include.
* (because it follows CPP_WRITTEN). This is used by do_include.
*
* OUTPUT_MARKS nonzero means keep Newline markers found in the input
* and insert such markers when appropriate. See `rescan' for details.
* OUTPUT_MARKS is 1 for macroexpanding a macro argument separately
* before substitution; it is 0 for other uses.
*/
*/
void
static
void
cpp_expand_to_buffer
(
pfile
,
buf
,
length
)
cpp_expand_to_buffer
(
pfile
,
buf
,
length
)
cpp_reader
*
pfile
;
cpp_reader
*
pfile
;
U_CHAR
*
buf
;
U_CHAR
*
buf
;
...
@@ -2059,6 +2051,7 @@ cpp_expand_to_buffer (pfile, buf, length)
...
@@ -2059,6 +2051,7 @@ cpp_expand_to_buffer (pfile, buf, length)
buf1
[
length
]
=
0
;
buf1
[
length
]
=
0
;
ip
=
cpp_push_buffer
(
pfile
,
buf1
,
length
);
ip
=
cpp_push_buffer
(
pfile
,
buf1
,
length
);
ip
->
has_escapes
=
1
;
#if 0
#if 0
ip->lineno = obuf.lineno = 1;
ip->lineno = obuf.lineno = 1;
#endif
#endif
...
@@ -2249,7 +2242,7 @@ output_line_command (pfile, conditional, file_change)
...
@@ -2249,7 +2242,7 @@ output_line_command (pfile, conditional, file_change)
}
}
/*
/*
* Parse a macro argument and
store the info on it into *ARGPTR
.
* Parse a macro argument and
append the info on PFILE's token_buffer
.
* REST_ARGS means to absorb the rest of the args.
* REST_ARGS means to absorb the rest of the args.
* Return nonzero to indicate a syntax error.
* Return nonzero to indicate a syntax error.
*/
*/
...
@@ -2734,6 +2727,8 @@ macroexpand (pfile, hp)
...
@@ -2734,6 +2727,8 @@ macroexpand (pfile, hp)
dump_single_macro (hp, pcp_outfile);
dump_single_macro (hp, pcp_outfile);
#endif
#endif
pfile
->
output_escapes
++
;
nargs
=
defn
->
nargs
;
nargs
=
defn
->
nargs
;
if
(
nargs
>=
0
)
if
(
nargs
>=
0
)
...
@@ -2886,6 +2881,13 @@ macroexpand (pfile, hp)
...
@@ -2886,6 +2881,13 @@ macroexpand (pfile, hp)
one space except within an string or char token.*/
one space except within an string or char token.*/
if
(
is_space
[
c
])
if
(
is_space
[
c
])
{
{
if
(
CPP_WRITTEN
(
pfile
)
>
arg
->
stringified
&&
(
CPP_PWRITTEN
(
pfile
))[
-
1
]
==
'@'
)
{
/* "@ " escape markers are removed */
CPP_ADJUST_WRITTEN
(
pfile
,
-
1
);
continue
;
}
if
(
need_space
==
0
)
if
(
need_space
==
0
)
need_space
=
1
;
need_space
=
1
;
continue
;
continue
;
...
@@ -2941,12 +2943,10 @@ macroexpand (pfile, hp)
...
@@ -2941,12 +2943,10 @@ macroexpand (pfile, hp)
if
(
args
[
ap
->
argno
].
expand_length
<
0
)
if
(
args
[
ap
->
argno
].
expand_length
<
0
)
{
{
args
[
ap
->
argno
].
expanded
=
CPP_WRITTEN
(
pfile
);
args
[
ap
->
argno
].
expanded
=
CPP_WRITTEN
(
pfile
);
pfile
->
output_escapes
++
;
cpp_expand_to_buffer
(
pfile
,
cpp_expand_to_buffer
(
pfile
,
ARG_BASE
+
args
[
ap
->
argno
].
raw
,
ARG_BASE
+
args
[
ap
->
argno
].
raw
,
args
[
ap
->
argno
].
raw_length
);
args
[
ap
->
argno
].
raw_length
);
pfile
->
output_escapes
--
;
args
[
ap
->
argno
].
expand_length
args
[
ap
->
argno
].
expand_length
=
CPP_WRITTEN
(
pfile
)
-
args
[
ap
->
argno
].
expanded
;
=
CPP_WRITTEN
(
pfile
)
-
args
[
ap
->
argno
].
expanded
;
}
}
...
@@ -3040,7 +3040,10 @@ macroexpand (pfile, hp)
...
@@ -3040,7 +3040,10 @@ macroexpand (pfile, hp)
if
(
!
ap
->
raw_before
&&
totlen
>
0
&&
arg
->
expand_length
if
(
!
ap
->
raw_before
&&
totlen
>
0
&&
arg
->
expand_length
&&
!
CPP_TRADITIONAL
(
pfile
)
&&
!
CPP_TRADITIONAL
(
pfile
)
&&
unsafe_chars
(
xbuf
[
totlen
-
1
],
expanded
[
0
]))
&&
unsafe_chars
(
xbuf
[
totlen
-
1
],
expanded
[
0
]))
xbuf
[
totlen
++
]
=
' '
;
{
xbuf
[
totlen
++
]
=
'@'
;
xbuf
[
totlen
++
]
=
' '
;
}
bcopy
(
expanded
,
xbuf
+
totlen
,
arg
->
expand_length
);
bcopy
(
expanded
,
xbuf
+
totlen
,
arg
->
expand_length
);
totlen
+=
arg
->
expand_length
;
totlen
+=
arg
->
expand_length
;
...
@@ -3048,7 +3051,10 @@ macroexpand (pfile, hp)
...
@@ -3048,7 +3051,10 @@ macroexpand (pfile, hp)
if
(
!
ap
->
raw_after
&&
totlen
>
0
&&
offset
<
defn
->
length
if
(
!
ap
->
raw_after
&&
totlen
>
0
&&
offset
<
defn
->
length
&&
!
CPP_TRADITIONAL
(
pfile
)
&&
!
CPP_TRADITIONAL
(
pfile
)
&&
unsafe_chars
(
xbuf
[
totlen
-
1
],
exp
[
offset
]))
&&
unsafe_chars
(
xbuf
[
totlen
-
1
],
exp
[
offset
]))
xbuf
[
totlen
++
]
=
' '
;
{
xbuf
[
totlen
++
]
=
'@'
;
xbuf
[
totlen
++
]
=
' '
;
}
/* If a macro argument with newlines is used multiple times,
/* If a macro argument with newlines is used multiple times,
then only expand the newlines once. This avoids creating
then only expand the newlines once. This avoids creating
...
@@ -3086,6 +3092,8 @@ macroexpand (pfile, hp)
...
@@ -3086,6 +3092,8 @@ macroexpand (pfile, hp)
}
}
pfile
->
output_escapes
--
;
/* Now put the expansion on the input stack
/* Now put the expansion on the input stack
so our caller will commence reading from it. */
so our caller will commence reading from it. */
push_macro_expansion
(
pfile
,
xbuf
,
xbuf_len
,
hp
);
push_macro_expansion
(
pfile
,
xbuf
,
xbuf_len
,
hp
);
...
@@ -3113,7 +3121,7 @@ push_macro_expansion (pfile, xbuf, xbuf_len, hp)
...
@@ -3113,7 +3121,7 @@ push_macro_expansion (pfile, xbuf, xbuf_len, hp)
mbuf
->
cleanup
=
macro_cleanup
;
mbuf
->
cleanup
=
macro_cleanup
;
mbuf
->
data
=
hp
;
mbuf
->
data
=
hp
;
/* The first char
of the expansion should be a ' '
added by
/* The first char
s of the expansion should be a "@ "
added by
collect_expansion. This is to prevent accidental token-pasting
collect_expansion. This is to prevent accidental token-pasting
between the text preceding the macro invocation, and the macro
between the text preceding the macro invocation, and the macro
expansion text.
expansion text.
...
@@ -3131,10 +3139,10 @@ push_macro_expansion (pfile, xbuf, xbuf_len, hp)
...
@@ -3131,10 +3139,10 @@ push_macro_expansion (pfile, xbuf, xbuf_len, hp)
Also, we don't need the extra space if the first char is '(',
Also, we don't need the extra space if the first char is '(',
or some other (less common) characters. */
or some other (less common) characters. */
if
(
xbuf
[
0
]
==
' '
if
(
xbuf
[
0
]
==
'
@'
&&
xbuf
[
1
]
==
'
'
&&
(
is_idchar
[
xbuf
[
1
]]
||
xbuf
[
1
]
==
'('
||
xbuf
[
1
]
==
'\''
&&
(
is_idchar
[
xbuf
[
2
]]
||
xbuf
[
2
]
==
'('
||
xbuf
[
2
]
==
'\''
||
xbuf
[
1
]
==
'\"'
))
||
xbuf
[
2
]
==
'\"'
))
mbuf
->
cur
++
;
mbuf
->
cur
+=
2
;
}
}
/* Like cpp_get_token, except that it does not read past end-of-line.
/* Like cpp_get_token, except that it does not read past end-of-line.
...
@@ -3368,7 +3376,7 @@ do_include (pfile, keyword, unused1, unused2)
...
@@ -3368,7 +3376,7 @@ do_include (pfile, keyword, unused1, unused2)
if
(
importing
)
if
(
importing
)
f
=
lookup_import
(
pfile
,
fname
,
NULL_PTR
);
f
=
lookup_import
(
pfile
,
fname
,
NULL_PTR
);
else
else
f
=
open_include_file
(
fname
,
NULL_PTR
);
f
=
open_include_file
(
pfile
,
fname
,
NULL_PTR
);
if
(
f
==
-
2
)
if
(
f
==
-
2
)
return
0
;
/* Already included this file */
return
0
;
/* Already included this file */
}
else
{
}
else
{
...
@@ -3413,7 +3421,7 @@ do_include (pfile, keyword, unused1, unused2)
...
@@ -3413,7 +3421,7 @@ do_include (pfile, keyword, unused1, unused2)
if
(
importing
)
if
(
importing
)
f
=
lookup_import
(
pfile
,
fname
,
searchptr
);
f
=
lookup_import
(
pfile
,
fname
,
searchptr
);
else
else
f
=
open_include_file
(
fname
,
searchptr
);
f
=
open_include_file
(
pfile
,
fname
,
searchptr
);
if
(
f
==
-
2
)
if
(
f
==
-
2
)
return
0
;
/* Already included this file */
return
0
;
/* Already included this file */
#ifdef EACCES
#ifdef EACCES
...
@@ -3453,7 +3461,7 @@ do_include (pfile, keyword, unused1, unused2)
...
@@ -3453,7 +3461,7 @@ do_include (pfile, keyword, unused1, unused2)
if
(
searchptr
->
fname
[
0
]
==
0
)
if
(
searchptr
->
fname
[
0
]
==
0
)
continue
;
continue
;
p
=
xmalloc
(
strlen
(
searchptr
->
fname
)
p
=
alloca
(
strlen
(
searchptr
->
fname
)
+
strlen
(
fname
)
+
2
);
+
strlen
(
fname
)
+
2
);
strcpy
(
p
,
searchptr
->
fname
);
strcpy
(
p
,
searchptr
->
fname
);
strcat
(
p
,
"/"
);
strcat
(
p
,
"/"
);
...
@@ -3717,12 +3725,20 @@ static void
...
@@ -3717,12 +3725,20 @@ static void
delete_assertion
(
hp
)
delete_assertion
(
hp
)
ASSERTION_HASHNODE
*
hp
;
ASSERTION_HASHNODE
*
hp
;
{
{
struct
tokenlist_list
*
tail
;
if
(
hp
->
prev
!=
NULL
)
if
(
hp
->
prev
!=
NULL
)
hp
->
prev
->
next
=
hp
->
next
;
hp
->
prev
->
next
=
hp
->
next
;
if
(
hp
->
next
!=
NULL
)
if
(
hp
->
next
!=
NULL
)
hp
->
next
->
prev
=
hp
->
prev
;
hp
->
next
->
prev
=
hp
->
prev
;
for
(
tail
=
hp
->
value
;
tail
;
)
{
struct
tokenlist_list
*
next
=
tail
->
next
;
free_token_list
(
tail
->
tokens
);
free
(
tail
);
tail
=
next
;
}
/* make sure that the bucket chain header that
/* make sure that the bucket chain header that
the deleted guy was on points to the right thing afterwards. */
the deleted guy was on points to the right thing afterwards. */
if
(
hp
==
*
hp
->
bucket_hdr
)
if
(
hp
==
*
hp
->
bucket_hdr
)
...
@@ -4748,8 +4764,8 @@ cpp_get_token (pfile)
...
@@ -4748,8 +4764,8 @@ cpp_get_token (pfile)
CPP_PUTC_Q
(
pfile
,
' '
);
CPP_PUTC_Q
(
pfile
,
' '
);
return
CPP_HSPACE
;
return
CPP_HSPACE
;
}
}
if
(
opts
->
for_lint
)
{
#if 0
#if 0
if (opts->for_lint) {
U_CHAR *argbp;
U_CHAR *argbp;
int cmdlen, arglen;
int cmdlen, arglen;
char *lintcmd = get_lintcmd (ibp, limit, &argbp, &arglen, &cmdlen);
char *lintcmd = get_lintcmd (ibp, limit, &argbp, &arglen, &cmdlen);
...
@@ -4775,8 +4791,8 @@ cpp_get_token (pfile)
...
@@ -4775,8 +4791,8 @@ cpp_get_token (pfile)
*(obp++) = ' '; /* just in case, if comments are copied thru */
*(obp++) = ' '; /* just in case, if comments are copied thru */
*(obp++) = '/';
*(obp++) = '/';
}
}
#endif
}
}
#endif
case
'#'
:
case
'#'
:
#if 0
#if 0
...
@@ -5004,6 +5020,14 @@ cpp_get_token (pfile)
...
@@ -5004,6 +5020,14 @@ cpp_get_token (pfile)
parse_name
(
pfile
,
GETC
());
parse_name
(
pfile
,
GETC
());
return
CPP_NAME
;
return
CPP_NAME
;
}
}
else
if
(
is_space
[
c
])
{
CPP_RESERVE
(
pfile
,
2
);
if
(
pfile
->
output_escapes
)
CPP_PUTC_Q
(
pfile
,
'@'
);
CPP_PUTC_Q
(
pfile
,
c
);
return
CPP_HSPACE
;
}
}
}
if
(
pfile
->
output_escapes
)
if
(
pfile
->
output_escapes
)
{
{
...
@@ -5214,22 +5238,21 @@ cpp_get_token (pfile)
...
@@ -5214,22 +5238,21 @@ cpp_get_token (pfile)
CPP_SET_WRITTEN
(
pfile
,
before_name_written
);
CPP_SET_WRITTEN
(
pfile
,
before_name_written
);
}
}
/* An extra
space
is added to the end of a macro expansion
/* An extra
"@ "
is added to the end of a macro expansion
to prevent accidental token pasting. We prefer to avoid
to prevent accidental token pasting. We prefer to avoid
unneeded extra spaces (for the sake of cpp-using tools like
unneeded extra spaces (for the sake of cpp-using tools like
imake). Here we remove the space if it is safe to do so. */
imake). Here we remove the space if it is safe to do so. */
if
(
pfile
->
buffer
->
rlimit
-
pfile
->
buffer
->
cur
>=
2
if
(
pfile
->
buffer
->
rlimit
-
pfile
->
buffer
->
cur
>=
3
&&
pfile
->
buffer
->
rlimit
[
-
2
]
==
'@'
&&
pfile
->
buffer
->
rlimit
[
-
1
]
==
' '
)
&&
pfile
->
buffer
->
rlimit
[
-
1
]
==
' '
)
{
{
int
c1
=
pfile
->
buffer
->
rlimit
[
-
2
];
int
c1
=
pfile
->
buffer
->
rlimit
[
-
3
];
int
c2
=
CPP_BUF_PEEK
(
CPP_PREV_BUFFER
(
CPP_BUFFER
(
pfile
)));
int
c2
=
CPP_BUF_PEEK
(
CPP_PREV_BUFFER
(
CPP_BUFFER
(
pfile
)));
if
(
c2
==
EOF
||
!
unsafe_chars
(
c1
,
c2
))
if
(
c2
==
EOF
||
!
unsafe_chars
(
c1
,
c2
))
pfile
->
buffer
->
rlimit
--
;
pfile
->
buffer
->
rlimit
-=
2
;
}
}
goto
get_next
;
}
}
return
CPP_NAME
;
goto
get_next
;
case
' '
:
case
'\t'
:
case
'\v'
:
case
'\r'
:
case
' '
:
case
'\t'
:
case
'\v'
:
case
'\r'
:
for
(;;)
for
(;;)
...
@@ -5342,7 +5365,7 @@ import_hash (f)
...
@@ -5342,7 +5365,7 @@ import_hash (f)
static
int
static
int
lookup_import
(
pfile
,
filename
,
searchptr
)
lookup_import
(
pfile
,
filename
,
searchptr
)
cpp_reader
*
pfile
;
cpp_reader
*
pfile
;
char
*
filename
;
char
*
filename
;
struct
file_name_list
*
searchptr
;
struct
file_name_list
*
searchptr
;
{
{
...
@@ -5363,7 +5386,7 @@ cpp_reader *pfile;
...
@@ -5363,7 +5386,7 @@ cpp_reader *pfile;
i
=
i
->
next
;
i
=
i
->
next
;
}
}
/* Open it and try a match on inode/dev */
/* Open it and try a match on inode/dev */
fd
=
open_include_file
(
filename
,
searchptr
);
fd
=
open_include_file
(
pfile
,
filename
,
searchptr
);
if
(
fd
<
0
)
if
(
fd
<
0
)
return
fd
;
return
fd
;
fstat
(
fd
,
&
sb
);
fstat
(
fd
,
&
sb
);
...
@@ -5455,26 +5478,26 @@ read_filename_string (ch, f)
...
@@ -5455,26 +5478,26 @@ read_filename_string (ch, f)
return
alloc
;
return
alloc
;
}
}
/* This structure holds a linked list of file name maps, one per directory. */
struct
file_name_map_list
{
struct
file_name_map_list
*
map_list_next
;
char
*
map_list_name
;
struct
file_name_map
*
map_list_map
;
};
/* Read the file name map file for DIRNAME. */
/* Read the file name map file for DIRNAME. */
static
struct
file_name_map
*
static
struct
file_name_map
*
read_name_map
(
dirname
)
read_name_map
(
pfile
,
dirname
)
cpp_reader
*
pfile
;
char
*
dirname
;
char
*
dirname
;
{
{
/* This structure holds a linked list of file name maps, one per
directory. */
struct
file_name_map_list
{
struct
file_name_map_list
*
map_list_next
;
char
*
map_list_name
;
struct
file_name_map
*
map_list_map
;
};
static
struct
file_name_map_list
*
map_list
;
register
struct
file_name_map_list
*
map_list_ptr
;
register
struct
file_name_map_list
*
map_list_ptr
;
char
*
name
;
char
*
name
;
FILE
*
f
;
FILE
*
f
;
for
(
map_list_ptr
=
map_list
;
map_list_ptr
;
for
(
map_list_ptr
=
CPP_OPTIONS
(
pfile
)
->
map_list
;
map_list_ptr
;
map_list_ptr
=
map_list_ptr
->
map_list_next
)
map_list_ptr
=
map_list_ptr
->
map_list_next
)
if
(
!
strcmp
(
map_list_ptr
->
map_list_name
,
dirname
))
if
(
!
strcmp
(
map_list_ptr
->
map_list_name
,
dirname
))
return
map_list_ptr
->
map_list_map
;
return
map_list_ptr
->
map_list_map
;
...
@@ -5535,8 +5558,8 @@ read_name_map (dirname)
...
@@ -5535,8 +5558,8 @@ read_name_map (dirname)
fclose
(
f
);
fclose
(
f
);
}
}
map_list_ptr
->
map_list_next
=
map_list
;
map_list_ptr
->
map_list_next
=
CPP_OPTIONS
(
pfile
)
->
map_list
;
map_list
=
map_list_ptr
;
CPP_OPTIONS
(
pfile
)
->
map_list
=
map_list_ptr
;
return
map_list_ptr
->
map_list_map
;
return
map_list_ptr
->
map_list_map
;
}
}
...
@@ -5547,7 +5570,8 @@ read_name_map (dirname)
...
@@ -5547,7 +5570,8 @@ read_name_map (dirname)
read_name_map. */
read_name_map. */
static
int
static
int
open_include_file
(
filename
,
searchptr
)
open_include_file
(
pfile
,
filename
,
searchptr
)
cpp_reader
*
pfile
;
char
*
filename
;
char
*
filename
;
struct
file_name_list
*
searchptr
;
struct
file_name_list
*
searchptr
;
{
{
...
@@ -5557,7 +5581,8 @@ open_include_file (filename, searchptr)
...
@@ -5557,7 +5581,8 @@ open_include_file (filename, searchptr)
if
(
searchptr
&&
!
searchptr
->
got_name_map
)
if
(
searchptr
&&
!
searchptr
->
got_name_map
)
{
{
searchptr
->
name_map
=
read_name_map
(
searchptr
->
fname
searchptr
->
name_map
=
read_name_map
(
pfile
,
searchptr
->
fname
?
searchptr
->
fname
:
"."
);
?
searchptr
->
fname
:
"."
);
searchptr
->
got_name_map
=
1
;
searchptr
->
got_name_map
=
1
;
}
}
...
@@ -5606,7 +5631,7 @@ open_include_file (filename, searchptr)
...
@@ -5606,7 +5631,7 @@ open_include_file (filename, searchptr)
dir
[
p
-
filename
]
=
'\0'
;
dir
[
p
-
filename
]
=
'\0'
;
from
=
p
+
1
;
from
=
p
+
1
;
}
}
for
(
map
=
read_name_map
(
dir
);
map
;
map
=
map
->
map_next
)
for
(
map
=
read_name_map
(
pfile
,
dir
);
map
;
map
=
map
->
map_next
)
if
(
!
strcmp
(
map
->
map_from
,
from
))
if
(
!
strcmp
(
map
->
map_from
,
from
))
return
open
(
map
->
map_to
,
O_RDONLY
,
0666
);
return
open
(
map
->
map_to
,
O_RDONLY
,
0666
);
...
@@ -6783,6 +6808,74 @@ cpp_finish (pfile)
...
@@ -6783,6 +6808,74 @@ cpp_finish (pfile)
}
}
}
}
}
}
/* Free resources used by PFILE. */
void
cpp_cleanup
(
pfile
)
cpp_reader
*
pfile
;
{
int
i
;
while
(
CPP_BUFFER
(
pfile
)
!=
CPP_NULL_BUFFER
(
pfile
))
cpp_pop_buffer
(
pfile
);
if
(
pfile
->
token_buffer
)
{
free
(
pfile
->
token_buffer
);
pfile
->
token_buffer
=
NULL
;
}
if
(
pfile
->
deps_buffer
)
{
free
(
pfile
->
deps_buffer
);
pfile
->
deps_buffer
=
NULL
;
pfile
->
deps_allocated_size
=
0
;
}
while
(
pfile
->
if_stack
)
{
IF_STACK_FRAME
*
temp
=
pfile
->
if_stack
;
pfile
->
if_stack
=
temp
->
next
;
free
(
temp
);
}
while
(
pfile
->
dont_repeat_files
)
{
struct
file_name_list
*
temp
=
pfile
->
dont_repeat_files
;
pfile
->
dont_repeat_files
=
temp
->
next
;
free
(
temp
->
fname
);
free
(
temp
);
}
while
(
pfile
->
all_include_files
)
{
struct
file_name_list
*
temp
=
pfile
->
all_include_files
;
pfile
->
all_include_files
=
temp
->
next
;
free
(
temp
->
fname
);
free
(
temp
);
}
for
(
i
=
IMPORT_HASH_SIZE
;
--
i
>=
0
;
)
{
register
struct
import_file
*
imp
=
pfile
->
import_hash_table
[
i
];
while
(
imp
)
{
struct
import_file
*
next
=
imp
->
next
;
free
(
imp
->
name
);
free
(
imp
);
imp
=
next
;
}
pfile
->
import_hash_table
[
i
]
=
0
;
}
for
(
i
=
ASSERTION_HASHSIZE
;
--
i
>=
0
;
)
{
while
(
pfile
->
assertion_hashtab
[
i
])
delete_assertion
(
pfile
->
assertion_hashtab
[
i
]);
}
cpp_hash_cleanup
(
pfile
);
}
static
int
static
int
do_assert
(
pfile
,
keyword
,
buf
,
limit
)
do_assert
(
pfile
,
keyword
,
buf
,
limit
)
...
@@ -6914,15 +7007,9 @@ do_unassert (pfile, keyword, buf, limit)
...
@@ -6914,15 +7007,9 @@ do_unassert (pfile, keyword, buf, limit)
/* If no token list was specified, then eliminate this assertion
/* If no token list was specified, then eliminate this assertion
entirely. */
entirely. */
if
(
!
tokens_specified
)
{
if
(
!
tokens_specified
)
struct
tokenlist_list
*
next
;
for
(
tail
=
hp
->
value
;
tail
;
tail
=
next
)
{
next
=
tail
->
next
;
free_token_list
(
tail
->
tokens
);
free
(
tail
);
}
delete_assertion
(
hp
);
delete_assertion
(
hp
);
}
else
{
else
{
/* If a list of tokens was given, then delete any matching list. */
/* If a list of tokens was given, then delete any matching list. */
tail
=
hp
->
value
;
tail
=
hp
->
value
;
...
@@ -7528,4 +7615,6 @@ cpp_perror_with_name (pfile, name)
...
@@ -7528,4 +7615,6 @@ cpp_perror_with_name (pfile, name)
* Support for trigraphs.
* Support for trigraphs.
*
*
* Support -dM flag (dump_all_macros).
* Support -dM flag (dump_all_macros).
*
* Support for_lint flag.
*/
*/
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment