source_location linemap_position_for_column (struct line_maps *set, unsigned int to_column) { source_location r = set->highest_line; linemap_assert (!linemap_macro_expansion_map_p (LINEMAPS_LAST_ORDINARY_MAP (set))); if (to_column >= set->max_column_hint) { if (r >= 0xC000000 || to_column > 100000) { /* Running low on source_locations - disable column numbers. */ return r; } else { struct line_map *map = LINEMAPS_LAST_ORDINARY_MAP (set); r = linemap_line_start (set, SOURCE_LINE (map, r), to_column + 50); } } r = r + to_column; if (r >= set->highest_location) set->highest_location = r; return r; }
static void java_next_unicode (void) { struct java_lexer *lex = ctxp->lexer; lex->position.col += lex->next_columns; if (lex->next_unicode == '\n') { lex->position.line++; #ifndef JC1_LITE #ifdef USE_MAPPED_LOCATION input_location = linemap_line_start (&line_table, lex->position.line, 120); #else input_line = lex->position.line; #endif #endif } lex->avail_unicode = 0; }
source_location linemap_position_for_column (struct line_maps *set, unsigned int to_column) { source_location r = set->highest_line; if (to_column >= set->max_column_hint) { if (r >= 0xC000000 || to_column > 100000) { /* Running low on source_locations - disable column numbers. */ return r; } else { struct line_map *map = &set->maps[set->used - 1]; r = linemap_line_start (set, SOURCE_LINE (map, r), to_column + 50); } } r = r + to_column; if (r >= set->highest_location) set->highest_location = r; return r; }
load_file (char *filename, bool initial) { char *line; gfc_linebuf *b; gfc_file *f; FILE *input; int len, line_len; for (f = current_file; f; f = f->up) if (strcmp (filename, f->filename) == 0) { gfc_error_now ("File '%s' is being included recursively", filename); return FAILURE; } if (initial) { input = gfc_open_file (filename); if (input == NULL) { gfc_error_now ("Can't open file '%s'", filename); return FAILURE; } } else { input = gfc_open_included_file (filename, false); if (input == NULL) { gfc_error_now ("Can't open included file '%s'", filename); return FAILURE; } } /* Load the file. */ f = get_file (filename, initial ? LC_RENAME : LC_ENTER); f->up = current_file; current_file = f; current_file->line = 1; line = NULL; line_len = 0; for (;;) { int trunc = load_line (input, &line, &line_len); len = strlen (line); if (feof (input) && len == 0) break; /* There are three things this line can be: a line of Fortran source, an include line or a C preprocessor directive. */ if (line[0] == '#') { preprocessor_line (line); continue; } if (include_line (line)) { current_file->line++; continue; } /* Add line. */ b = gfc_getmem (gfc_linebuf_header_size + len + 1); #ifdef USE_MAPPED_LOCATION b->location = linemap_line_start (&line_table, current_file->line++, 120); #else b->linenum = current_file->line++; #endif b->file = current_file; b->truncated = trunc; strcpy (b->line, line); if (line_head == NULL) line_head = b; else line_tail->next = b; line_tail = b; } /* Release the line buffer allocated in load_line. */ gfc_free (line); fclose (input); current_file = current_file->up; #ifdef USE_MAPPED_LOCATION linemap_add (&line_table, LC_LEAVE, 0, NULL, 0); #endif return SUCCESS; }
java_lexer * java_new_lexer (FILE *finput, const char *encoding) { java_lexer *lex = XNEW (java_lexer); int enc_error = 0; lex->finput = finput; lex->bs_count = 0; lex->unget_value = 0; lex->next_unicode = 0; lex->avail_unicode = 0; lex->next_columns = 1; lex->encoding = encoding; lex->position.line = 1; lex->position.col = 1; #ifndef JC1_LITE #ifdef USE_MAPPED_LOCATION input_location = linemap_line_start (&line_table, 1, 120); #else input_line = 1; #endif #endif #ifdef HAVE_ICONV lex->handle = iconv_open ("UCS-2", encoding); if (lex->handle != (iconv_t) -1) { lex->first = -1; lex->last = -1; lex->out_first = -1; lex->out_last = -1; lex->read_anything = 0; lex->use_fallback = 0; /* Work around broken iconv() implementations by doing checking at runtime. We assume that if the UTF-8 => UCS-2 encoder is broken, then all UCS-2 encoders will be broken. Perhaps not a valid assumption. */ if (! byteswap_init) { iconv_t handle; byteswap_init = 1; handle = iconv_open ("UCS-2", "UTF-8"); if (handle != (iconv_t) -1) { unicode_t result; unsigned char in[3]; char *inp, *outp; size_t inc, outc, r; /* This is the UTF-8 encoding of \ufeff. */ in[0] = 0xef; in[1] = 0xbb; in[2] = 0xbf; inp = (char *) in; inc = 3; outp = (char *) &result; outc = 2; r = iconv (handle, (ICONV_CONST char **) &inp, &inc, &outp, &outc); iconv_close (handle); /* Conversion must be complete for us to use the result. */ if (r != (size_t) -1 && inc == 0 && outc == 0) need_byteswap = (result != 0xfeff); } } lex->byte_swap = need_byteswap; } else #endif /* HAVE_ICONV */ { /* If iconv failed, use the internal decoder if the default encoding was requested. This code is used on platforms where iconv exists but is insufficient for our needs. For instance, on Solaris 2.5 iconv cannot handle UTF-8 or UCS-2. On Solaris the default encoding, as returned by nl_langinfo(), is `646' (aka ASCII), but the Solaris iconv_open() doesn't understand that. We work around that by pretending `646' to be the same as UTF-8. */ if (strcmp (encoding, DEFAULT_ENCODING) && strcmp (encoding, "646")) enc_error = 1; #ifdef HAVE_ICONV else { lex->use_fallback = 1; lex->encoding = "UTF-8"; } #endif /* HAVE_ICONV */ } if (enc_error) fatal_error ("unknown encoding: %qs\nThis might mean that your locale's encoding is not supported\nby your system's iconv(3) implementation. If you aren't trying\nto use a particular encoding for your input file, try the\n%<--encoding=UTF-8%> option", encoding); return lex; }