304f12270d
If we process the import directive inline, then the ordering of the commands for the "on xxx" sections would be a little unexpected. The init.rc files do not really have an implied order as to which section appears and gets processed first. The init code itself provides that ordering explicitly. For the user, the expectation is that if both the current file and the imported file define a section (e.g. "on init"), then the commands in the current file will be executed first, and then the ones from the imported file(s). The current implementation did not do that. It processed the import directive inline, and thus the imported (i.e. dependent) files would appear first in the command lists for the sections. This created unintended side effects and the solution would have been to try and put the import lines somewhere in the middle of the init file. This would be difficult to notice and hard to extract the dependencies. To solve this, we add the imports to a list for each file being parsed and process the list after finishing parsing the file. This provides predictable order for imports and provides a logical flow from the user perspective: the currently parsed file gets to run its commands before the files being imported. Change-Id: I06dc35ff286314060e16b18923683cd2787269de Signed-off-by: Dima Zavin <dima@android.com>
41 lines
1.1 KiB
C
41 lines
1.1 KiB
C
/*
|
|
* Copyright (C) 2010 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef PARSER_H_
|
|
#define PARSER_H_
|
|
|
|
#define T_EOF 0
|
|
#define T_TEXT 1
|
|
#define T_NEWLINE 2
|
|
|
|
struct parse_state
|
|
{
|
|
char *ptr;
|
|
char *text;
|
|
int line;
|
|
int nexttoken;
|
|
void *context;
|
|
void (*parse_line)(struct parse_state *state, int nargs, char **args);
|
|
const char *filename;
|
|
void *priv;
|
|
};
|
|
|
|
int lookup_keyword(const char *s);
|
|
void DUMP(void);
|
|
int next_token(struct parse_state *state);
|
|
void parse_error(struct parse_state *state, const char *fmt, ...);
|
|
|
|
#endif /* PARSER_H_ */
|