#include <stdlib.h>
#include <assert.h>
#include <stdio.h> /* only for dump_line_offsets() */
#include "line_offsets.h"
typedef
struct
{
int
num_slots, num_lines;
int
*offsets;
} line_offsets_t;
static
line_offsets_t line_offsets = { 0, 0, NULL };
void
initialize_line_offsets (
void
)
{
if
(line_offsets.num_slots == 0)
{
line_offsets.num_slots = 1024;
line_offsets.offsets =
(
int
*)
malloc
(line_offsets.num_slots *
sizeof
(
int
));
}
line_offsets.offsets[0] = 0;
line_offsets.num_lines = 1;
}
void
record_line_offset (
int
line,
int
offset)
{
assert
(line_offsets.num_slots > 0);
if
(line >= line_offsets.num_slots)
{
line_offsets.num_slots *= 2;
line_offsets.offsets =
(
int
*)
realloc
((
void
*) line_offsets.offsets,
line_offsets.num_slots *
sizeof
(
int
));
}
assert
(line_offsets.num_lines == line);
line_offsets.offsets[line] = offset;
line_offsets.num_lines++;
}
int
line_offset (
int
line)
{
return
line_offsets.offsets[line-1];
}
void
dump_line_offsets (
char
*filename,
FILE
*stream)
{
int
i;
fprintf
(stream,
"Line offsets in %s:\n"
, filename);
fprintf
(stream,
"%4s %6s\n"
,
"Line"
,
"Offset"
);
for
(i = 0; i < line_offsets.num_lines; i++)
fprintf
(stream,
"%4d %6d (%04x)\n"
,
i+1, line_offsets.offsets[i], line_offsets.offsets[i]);
}