char *line, *line_end, *real_line, *caret;
unsigned long real_line_len;
- unsigned long new_line_number = 1;
+ unsigned long new_line_number = 1, line_number = 1;
unsigned long newlines;
char *symbol_name, *real_symbol_name;
while (!load_line (&line, &line_end, &real_line, &real_line_len, &newlines, fp, &load_line_internal_data)) {
+ line_number = new_line_number;
+ new_line_number += newlines + 1;
+
caret = (line = skip_whitespace (line));
if (line < line_end) {
}
- symbol_name = caret;
-
while (isalnum ((int) *caret) || *caret == '_') {
caret++;
}
- line = caret;
+ if (*caret == '@') {
- if (isspace ((int) *line)) {
- line = skip_whitespace (line + 1);
- }
+ caret++;
+
+ while (isdigit ((int) *caret)) {
+ caret++;
+ }
- *caret = '\0';
+ }
+
+ symbol_name = xstrndup (line, caret - line);
+ line = skip_whitespace (caret);
if (!has_exports) {
}
has_exports = 1;
+
+ free (symbol_name);
continue;
}
if (*line == '=') {
real_symbol_name = symbol_name;
- caret = skip_whitespace (line + 1);
+ caret = (line = skip_whitespace (line + 1));
if (!isalnum ((int) *caret) && *caret != '_') {
}
- symbol_name = caret;
-
while (isalnum ((int) *caret) || *caret == '_') {
caret++;
}
- line = caret;
+ if (*caret == '@') {
+
+ caret++;
+
+ while (isdigit ((int) *caret)) {
+ caret++;
+ }
- if (isspace ((int) *line)) {
- line = skip_whitespace (line + 1);
}
- *caret = '\0';
+ symbol_name = xstrndup (line, caret - line);
+ line = skip_whitespace (caret);
if ((symbol = symbol_find (symbol_name))) {
- symbol->real_name = xstrdup (real_symbol_name);
+
+ symbol->real_name = real_symbol_name;
+ export_symbol_callback (symbol);
+
}
+ } else if ((symbol = symbol_find (symbol_name))) {
+ export_symbol_callback (symbol);
}
- if ((symbol = symbol_find (symbol_name))) {
- export_symbol_callback (symbol);
+ if (*line != '\0' && *line != '\n') {
+ report_at (program_name, 0, REPORT_ERROR, "Stray '%c' on line %lu in %s", *line, line_number, ifile);
}
}