[COMPILER]

* BUG: Correctly handle public string constants larger than 255 characters.


git-svn-id: svn://localhost/gambas/trunk@5638 867c0c6c-44f3-4631-809d-bfa615b0a4ec
This commit is contained in:
Benoît Minisini 2013-05-04 02:54:35 +00:00
parent 59756d47e5
commit 58e19c65a1
2 changed files with 77 additions and 55 deletions

View file

@ -43,7 +43,8 @@
static FILE *_finfo;
static char *_buffer = NULL;
static int _buffer_ptr = 0;
static const char *get_name(int index)
{
@ -321,32 +322,6 @@ static void create_file(FILE **fw, const char *file)
}
}
static char *read_line(FILE *f, int *plen)
{
int len;
char *line;
if (!f)
return NULL;
line = fgets(COMMON_buffer, COMMON_BUF_MAX, f);
if (!line)
return NULL;
len = strlen(line);
if (line[len - 1] == '\n')
{
line[len - 1] = 0;
len--;
}
if (plen)
*plen = len;
return line;
}
static void close_file_and_rename(FILE *f, const char *file, const char *dest)
{
if (f)
@ -371,24 +346,72 @@ static bool exist_bytecode_file(char *name)
return exist;
}
static void read_line(char **line, int *len)
{
int l;
char c;
int lmax;
*line = NULL;
*len = 0;
if (!_buffer)
return;
lmax = BUFFER_length(_buffer);
if (_buffer_ptr >= lmax)
return;
*line = &_buffer[_buffer_ptr];
l = 0;
for(;;)
{
if (_buffer_ptr >= lmax)
break;
c = _buffer[_buffer_ptr++];
if (c == '\n')
{
_buffer[_buffer_ptr - 1] = 0;
break;
}
l++;
}
*len = l;
}
static bool load_file(const char *name)
{
_buffer_ptr = 0;
BUFFER_create(&_buffer);
if (BUFFER_load_file(&_buffer, name))
{
BUFFER_delete(&_buffer);
return TRUE;
}
else
return FALSE;
}
static void class_update_exported(CLASS *class)
{
FILE *fw = NULL;
FILE *fr;
char *name;
int len;
bool inserted = FALSE;
bool optional;
int cmp;
fr = fopen(".list", "r");
if (!fr && !class->exported)
if (load_file(".list") && !class->exported)
return;
//if (!fr && !class->exported)
// return;
for(;;)
{
name = read_line(fr, &len);
read_line(&name, &len);
optional = FALSE;
if (!name)
@ -442,8 +465,8 @@ static void class_update_exported(CLASS *class)
}
}
if (fr)
fclose(fr);
if (_buffer)
BUFFER_delete(&_buffer);
close_file_and_rename(fw, ".list#", ".list");
}
@ -672,7 +695,6 @@ static void output_help(void)
void CLASS_export(void)
{
FILE *fw = NULL;
FILE *fr;
char *line;
int len;
bool inserted = FALSE;
@ -688,9 +710,9 @@ void CLASS_export(void)
class_update_exported(class);
fr = fopen(".info", "r");
load_file(".info");
line = read_line(fr, &len);
read_line(&line, &len);
for(;;)
{
@ -706,7 +728,7 @@ void CLASS_export(void)
for(;;)
{
line = read_line(fr, &len);
read_line(&line, &len);
if (!line || *line == '#')
break;
}
@ -735,7 +757,7 @@ void CLASS_export(void)
create_file(&fw, ".info#");
fputs(line, fw);
fputc('\n', fw);
line = read_line(fr, NULL);
read_line(&line, &len);
if (!line || *line == '#')
break;
}
@ -746,15 +768,15 @@ void CLASS_export(void)
printf("Remove '%s' information from .info file\n", &line[1]);
for(;;)
{
line = read_line(fr, NULL);
read_line(&line, &len);
if (!line || *line == '#')
break;
}
}
}
if (fr)
fclose(fr);
if (_buffer)
BUFFER_delete(&_buffer);
close_file_and_rename(fw, ".info#", ".info");
return;

View file

@ -180,7 +180,7 @@ static void flush_buffer(void)
if (len <= 0)
return;
if (UNLIKELY(fwrite(_buffer, sizeof(char), len, _file) != len))
if (fwrite(_buffer, sizeof(char), len, _file) != len)
THROW("Write error");
_pbuffer = _buffer;
@ -193,7 +193,7 @@ static void write_byte(unsigned char val)
printf("%ld : b %u 0x%X\n", get_pos(), val, val);
#endif
if (UNLIKELY(_pbuffer >= _mbuffer))
if (_pbuffer >= _mbuffer)
flush_buffer();
*_pbuffer++ = val;
@ -210,10 +210,10 @@ static void write_short(ushort val)
printf("%ld : i %u 0x%X\n", get_pos(), val, val);
#endif
if (UNLIKELY(_swap))
if (_swap)
SWAP_short((short *)&val);
if (UNLIKELY(_pbuffer >= _mbuffer))
if (_pbuffer >= _mbuffer)
flush_buffer();
*((ushort *)_pbuffer) = val;
@ -228,10 +228,10 @@ static void write_int(uint val)
printf("%ld : l %lu 0x%lX\n", get_pos(), val, val);
#endif
if (UNLIKELY(_swap))
if (_swap)
SWAP_int((int *)&val);
if (UNLIKELY(_pbuffer >= _mbuffer))
if (_pbuffer >= _mbuffer)
flush_buffer();
*((uint *)_pbuffer) = val;
@ -246,10 +246,10 @@ static void write_int64(uint64_t val)
printf("%ld : l %llu 0x%llX\n", get_pos(), val, val);
#endif
if (UNLIKELY(_swap))
if (_swap)
SWAP_int64((int64_t *)&val);
if (UNLIKELY(_pbuffer >= _mbuffer))
if (_pbuffer >= _mbuffer)
flush_buffer();
*((uint64_t *)_pbuffer) = val;
@ -263,7 +263,7 @@ static void write_string(const char *str, int len)
printf("%ld : s \"%.*s\"\n", get_pos(), len, str);
#endif
if (UNLIKELY(&_pbuffer[len] > _mbuffer))
if (&_pbuffer[len] > _mbuffer)
flush_buffer();
if (&_pbuffer[len] <= _mbuffer)
@ -275,7 +275,7 @@ static void write_string(const char *str, int len)
return;
}
if (UNLIKELY(fwrite(str, sizeof(char), len, _file) != len))
if (fwrite(str, sizeof(char), len, _file) != len)
THROW("Write error");
_pos += len;
@ -305,7 +305,7 @@ static void write_buffer(void *str, int len)
flush_buffer();
if (UNLIKELY(fwrite(str, sizeof(char), len, _file) != len))
if (fwrite(str, sizeof(char), len, _file) != len)
THROW("Write error");
_pos += len;