Mostly clean-up:
- cut up those huge include files into separate interfaces for all modules.
Put the interface documentation there, and not with the implementation.
- light-weight includes for needed concrete types (lst_t.h, timestamp_t.h).
- cut out some more logically separate parts: cmd_exec, varname, parsevar,
timestamp.
- put all error handling functions together, so that we will be able to
clean them up.
- more systematic naming: functioni to handle interval, function to handle
string.
- put the init/end code apart to minimize coupling.
- kill weird types like ReturnStatus and Boolean. Use standard bool (with a
fallback for non-iso systems)
- better interface documentation for lots of subsystems.
As a result, make compilation goes somewhat faster (5%, even considering
the largish BSD copyrights to read). The corresponding preprocessed
source goes down from 1,5M to 1M.
A few minor code changes as well: Parse_DoVar is no longer destructive.
Parse_IsVar functionality is folded into Parse_DoVar (as it knows what an
assignment is), a few more interval handling functions. Avoid calling
XXX_End when they do nothing, just #define XXX_End to nothing.
Parse_DoVar is slightly more general: it will handle compound assignments
as long as they make sense, e.g., VAR +!= cmd
will work. As a side effect, VAR++=value now triggers an error
(two + in assignment).
- this stuff doesn't occur in portable Makefiles.
- writing VAR++ = value or VAR+ +=value disambiguates it.
- this is a good thing, it uncovered a bug in bsd.port.mk.
Tested by naddy@. Okayed millert@. I'll handle the fallback if there is
any. This went through a full make build anyways, including isakmpd
(without mickey's custom binutils, as he didn't see fit to share it with me).
2001-05-23 05:34:39 -07:00
|
|
|
#ifndef LOWPARSE_H
|
|
|
|
#define LOWPARSE_H
|
|
|
|
|
2012-10-02 03:29:30 -07:00
|
|
|
/* $OpenBSD: lowparse.h,v 1.11 2012/10/02 10:29:31 espie Exp $ */
|
This patch is worth a lot, speed-wise.
This does introduce a proper stack of IFiles to handle included files:
instead of having the current file be a special case, it's also an IFile.
The corresponding code is slightly unobfuscated, removing the error-prone
ParseEOF function, freeing the filename systematically (thus, main.c needs
to strdup stdin), and merging both include functions lookup into one.
The speed gain comes from changing the IFile structure to merge with
fgetln seamlessly.
The low-level parse code is mostly moved to a new file, lowparse.c, to
make things easier to read (see next patch as well).
Accordingly, util.c gains a fgetln.
Note the interaction between Parse_File, Dir_FindFile, and ReadMakefile in
main.c. This patch closes a subtle memory hole (only the Makefile names,
so rather small).
Reviewed by miod@.
2000-06-23 09:39:45 -07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright (c) 1999 Marc Espie.
|
|
|
|
*
|
|
|
|
* Extensive code changes for the OpenBSD project.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE OPENBSD PROJECT AND CONTRIBUTORS
|
|
|
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBSD
|
|
|
|
* PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
Mostly clean-up:
- cut up those huge include files into separate interfaces for all modules.
Put the interface documentation there, and not with the implementation.
- light-weight includes for needed concrete types (lst_t.h, timestamp_t.h).
- cut out some more logically separate parts: cmd_exec, varname, parsevar,
timestamp.
- put all error handling functions together, so that we will be able to
clean them up.
- more systematic naming: functioni to handle interval, function to handle
string.
- put the init/end code apart to minimize coupling.
- kill weird types like ReturnStatus and Boolean. Use standard bool (with a
fallback for non-iso systems)
- better interface documentation for lots of subsystems.
As a result, make compilation goes somewhat faster (5%, even considering
the largish BSD copyrights to read). The corresponding preprocessed
source goes down from 1,5M to 1M.
A few minor code changes as well: Parse_DoVar is no longer destructive.
Parse_IsVar functionality is folded into Parse_DoVar (as it knows what an
assignment is), a few more interval handling functions. Avoid calling
XXX_End when they do nothing, just #define XXX_End to nothing.
Parse_DoVar is slightly more general: it will handle compound assignments
as long as they make sense, e.g., VAR +!= cmd
will work. As a side effect, VAR++=value now triggers an error
(two + in assignment).
- this stuff doesn't occur in portable Makefiles.
- writing VAR++ = value or VAR+ +=value disambiguates it.
- this is a good thing, it uncovered a bug in bsd.port.mk.
Tested by naddy@. Okayed millert@. I'll handle the fallback if there is
any. This went through a full make build anyways, including isakmpd
(without mickey's custom binutils, as he didn't see fit to share it with me).
2001-05-23 05:34:39 -07:00
|
|
|
/* low-level parsing module:
|
|
|
|
* select input stream to parse, and do high-speed processing of
|
|
|
|
* lines: skipping comments, handling continuation lines, or skipping
|
|
|
|
* over dead conditionals.
|
|
|
|
*
|
|
|
|
* Basic template:
|
|
|
|
*
|
|
|
|
* Parse_Fromxxx(source);
|
|
|
|
* do {
|
|
|
|
* while ((line = Parse_ReadNormalLine(&buf)) != NULL) {
|
2007-09-17 02:28:36 -07:00
|
|
|
* handle line, use Parse_Fromxxx to push includes,
|
Mostly clean-up:
- cut up those huge include files into separate interfaces for all modules.
Put the interface documentation there, and not with the implementation.
- light-weight includes for needed concrete types (lst_t.h, timestamp_t.h).
- cut out some more logically separate parts: cmd_exec, varname, parsevar,
timestamp.
- put all error handling functions together, so that we will be able to
clean them up.
- more systematic naming: functioni to handle interval, function to handle
string.
- put the init/end code apart to minimize coupling.
- kill weird types like ReturnStatus and Boolean. Use standard bool (with a
fallback for non-iso systems)
- better interface documentation for lots of subsystems.
As a result, make compilation goes somewhat faster (5%, even considering
the largish BSD copyrights to read). The corresponding preprocessed
source goes down from 1,5M to 1M.
A few minor code changes as well: Parse_DoVar is no longer destructive.
Parse_IsVar functionality is folded into Parse_DoVar (as it knows what an
assignment is), a few more interval handling functions. Avoid calling
XXX_End when they do nothing, just #define XXX_End to nothing.
Parse_DoVar is slightly more general: it will handle compound assignments
as long as they make sense, e.g., VAR +!= cmd
will work. As a side effect, VAR++=value now triggers an error
(two + in assignment).
- this stuff doesn't occur in portable Makefiles.
- writing VAR++ = value or VAR+ +=value disambiguates it.
- this is a good thing, it uncovered a bug in bsd.port.mk.
Tested by naddy@. Okayed millert@. I'll handle the fallback if there is
any. This went through a full make build anyways, including isakmpd
(without mickey's custom binutils, as he didn't see fit to share it with me).
2001-05-23 05:34:39 -07:00
|
|
|
* Parse_ReadNextConditional to get over non-conditional lines.
|
|
|
|
* or Parse_ReadUnparsedLine to handle special cases manually.
|
|
|
|
* }
|
|
|
|
* } while (Parse_NextFile());
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Selection of input stream */
|
|
|
|
/* Parse_FromFile(filename, filehandle);
|
|
|
|
* Push given filehandle on the input stack, using filename for diagnostic
|
|
|
|
* messages. The module assumes ownership of the filehandle and of
|
|
|
|
* the filename: provide copies if necessary. */
|
|
|
|
extern void Parse_FromFile(const char *, FILE *);
|
|
|
|
/* Parse_FromString(str, lineno);
|
|
|
|
* Push expanded string str on the input stack, assuming it starts at
|
|
|
|
* lineno in the current file. This is used to reparse .for loops
|
|
|
|
* after the variable has been expanded, hence no need to respecify
|
|
|
|
* the filename. The module assumes ownership of the string: provide a
|
|
|
|
* copy if necessary. */
|
|
|
|
extern void Parse_FromString(char *, unsigned long);
|
|
|
|
|
|
|
|
/* Error reporting, and tagging of read structures. */
|
|
|
|
/* lineno = Parse_Getlineno();
|
|
|
|
* Returns the current lineno. */
|
|
|
|
extern unsigned long Parse_Getlineno(void);
|
|
|
|
/* name = Parse_Getfilename();
|
|
|
|
* Returns the current filename. Safe to keep without copying. */
|
|
|
|
extern const char *Parse_Getfilename(void);
|
|
|
|
|
2012-03-22 06:47:12 -07:00
|
|
|
/* Parse_FillLocation(origin)
|
|
|
|
* Fill the location pointed by origin with the current location. */
|
|
|
|
extern void Parse_FillLocation(Location *);
|
|
|
|
|
2012-08-25 01:12:56 -07:00
|
|
|
/* Parse_SetLocation(origin)
|
|
|
|
* Set the "parse location" to a given origin.
|
|
|
|
* Used for parse errors that occur during variable expansion at
|
|
|
|
* runtime.
|
|
|
|
*/
|
|
|
|
extern void Parse_SetLocation(Location *);
|
|
|
|
|
Mostly clean-up:
- cut up those huge include files into separate interfaces for all modules.
Put the interface documentation there, and not with the implementation.
- light-weight includes for needed concrete types (lst_t.h, timestamp_t.h).
- cut out some more logically separate parts: cmd_exec, varname, parsevar,
timestamp.
- put all error handling functions together, so that we will be able to
clean them up.
- more systematic naming: functioni to handle interval, function to handle
string.
- put the init/end code apart to minimize coupling.
- kill weird types like ReturnStatus and Boolean. Use standard bool (with a
fallback for non-iso systems)
- better interface documentation for lots of subsystems.
As a result, make compilation goes somewhat faster (5%, even considering
the largish BSD copyrights to read). The corresponding preprocessed
source goes down from 1,5M to 1M.
A few minor code changes as well: Parse_DoVar is no longer destructive.
Parse_IsVar functionality is folded into Parse_DoVar (as it knows what an
assignment is), a few more interval handling functions. Avoid calling
XXX_End when they do nothing, just #define XXX_End to nothing.
Parse_DoVar is slightly more general: it will handle compound assignments
as long as they make sense, e.g., VAR +!= cmd
will work. As a side effect, VAR++=value now triggers an error
(two + in assignment).
- this stuff doesn't occur in portable Makefiles.
- writing VAR++ = value or VAR+ +=value disambiguates it.
- this is a good thing, it uncovered a bug in bsd.port.mk.
Tested by naddy@. Okayed millert@. I'll handle the fallback if there is
any. This went through a full make build anyways, including isakmpd
(without mickey's custom binutils, as he didn't see fit to share it with me).
2001-05-23 05:34:39 -07:00
|
|
|
/* continue = Parse_NextFile();
|
|
|
|
* Advance parsing to the next file in the input stack. Returns true
|
|
|
|
* if there is parsing left to do.
|
|
|
|
*/
|
|
|
|
extern bool Parse_NextFile(void);
|
|
|
|
|
|
|
|
|
|
|
|
/* line = Parse_ReadNormalLine(buf);
|
|
|
|
* Reads next line into buffer and return its contents. Handles line
|
|
|
|
* continuation, remove extra blanks, and skip trivial comments. tabs at
|
|
|
|
* beginning of line are left alone, to be able to recognize target
|
|
|
|
* lines. */
|
|
|
|
extern char *Parse_ReadNormalLine(Buffer);
|
|
|
|
|
|
|
|
/* line = ParseReadNextConditionalLine(buf);
|
|
|
|
* Returns next conditional line, skipping over everything else. */
|
|
|
|
extern char *Parse_ReadNextConditionalLine(Buffer);
|
|
|
|
/* line = ParseReadUnparsedLine(buf, type);
|
|
|
|
* Reads line without parsing anything beyond continuations.
|
|
|
|
* Handle special cases such as conditional lines, or lines that
|
|
|
|
* need a reparse (loops). */
|
|
|
|
extern char *Parse_ReadUnparsedLine(Buffer, const char *);
|
|
|
|
/* Parse_ReportErrors();
|
|
|
|
* At end of parsing, report on fatal errors.
|
|
|
|
*/
|
|
|
|
extern void Parse_ReportErrors(void);
|
major overhaul of the way make handle jobs, inspired by dpb:
instead of forking a "job" per target, and having that job further fork
separate commands, have make maintain a list of jobs, indexed by pid
of currently running commands, and handle process termination
continuation-style. This has lots of benefits:
- make is responsible for most printing, so we no longer need pipes nor
job control: make -j jobs see the tty.
- no more special-casing for jobs that don't really execute anything.
- unify code for make -jn and make -B, including signal handlers and
job waiting. So make -n, make -q, +cmd now run commands in the same
way in all cases.
- unified more accurate error-reporting, as make knows precisely which
command failed. Commands are tagged with their lines, and we display failing
commands in silent mode.
- fine-grained "expensive" command handling (recursion limiter). Do it
per-command instead of per-target.
Moreover, signal response is now simpler, as we just block the signals
in a small critical sections, test for events, and sigpause (thanks a lot
to guenther@ and millert@), so running make is now almost always paused
without any busy-waiting.
Thanks to everyone who tested and gave input.
2012-09-21 00:55:20 -07:00
|
|
|
|
|
|
|
extern void Parse_setcurdir(const char *);
|
This patch is worth a lot, speed-wise.
This does introduce a proper stack of IFiles to handle included files:
instead of having the current file be a special case, it's also an IFile.
The corresponding code is slightly unobfuscated, removing the error-prone
ParseEOF function, freeing the filename systematically (thus, main.c needs
to strdup stdin), and merging both include functions lookup into one.
The speed gain comes from changing the IFile structure to merge with
fgetln seamlessly.
The low-level parse code is mostly moved to a new file, lowparse.c, to
make things easier to read (see next patch as well).
Accordingly, util.c gains a fgetln.
Note the interaction between Parse_File, Dir_FindFile, and ReadMakefile in
main.c. This patch closes a subtle memory hole (only the Makefile names,
so rather small).
Reviewed by miod@.
2000-06-23 09:39:45 -07:00
|
|
|
#endif
|