Patch from Dmitry Potapov for fluid to not crash on (I think)

identifiers with trailing whitespace.

Fluid can now read in .xpm files with more than 2048 lines in them.


git-svn-id: file:///fltk/svn/fltk/branches/branch-1.0@1213 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Bill Spitzak 2000-06-16 07:08:16 +00:00
parent 4ab82443bd
commit 084b19e305
2 changed files with 39 additions and 19 deletions

View File

@ -1,5 +1,5 @@
//
// "$Id: Fluid_Image.cxx,v 1.7.2.3 2000/06/05 21:20:41 mike Exp $"
// "$Id: Fluid_Image.cxx,v 1.7.2.4 2000/06/16 07:08:15 bill Exp $"
//
// Pixmap label support for the Fast Light Tool Kit (FLTK).
//
@ -43,6 +43,7 @@ extern void leave_source_dir(); // in fluid.C
class pixmap_image : public Fluid_Image {
protected:
Fl_Pixmap *p;
int numlines;
int *linelength;
public:
pixmap_image(const char *name, FILE *);
@ -70,12 +71,11 @@ void pixmap_image::write_static() {
write_c("#include <FL/Fl_Pixmap.H>\n");
pixmap_header_written = write_number;
}
write_c("static unsigned char *%s[] = {\n",
write_c("static char *%s[] = {\n",
unique_id(this, "image", filename_name(name()), 0));
int l;
for (l = 0; p->data[l]; l++) {
for (l = 0; l < numlines; l++) {
if (l) write_c(",\n");
write_c("(unsigned char*)\n");
write_cstring(p->data[l],linelength[l]);
}
write_c("\n};\n");
@ -98,15 +98,19 @@ static int hexdigit(int x) {
}
#define MAXSIZE 2048
#define INITIALLINES 1024
pixmap_image::pixmap_image(const char *name, FILE *f) : Fluid_Image(name) {
if (!f) return; // for subclasses
// read all the c-strings out of the file:
char *data[MAXSIZE+1];
int length[MAXSIZE+1];
char* local_data[INITIALLINES];
char** data = local_data;
int local_length[INITIALLINES];
int* length = local_length;
int malloc_size = INITIALLINES;
char buffer[MAXSIZE+20];
int i = 0;
while (i < MAXSIZE && fgets(buffer,MAXSIZE+20,f)) {
while (fgets(buffer,MAXSIZE+20,f)) {
if (buffer[0] != '\"') continue;
char *p = buffer;
char *q = buffer+1;
@ -145,26 +149,42 @@ pixmap_image::pixmap_image(const char *name, FILE *f) : Fluid_Image(name) {
}
}
*p++ = 0;
if (i >= malloc_size) {
malloc_size = 2*malloc_size;
if (data == local_data) {
data = (char**)malloc(malloc_size*sizeof(char*));
memcpy(data, local_data, i*sizeof(char*));
length = (int*)malloc(malloc_size*sizeof(int));
memcpy(length, local_length, i*sizeof(int));
} else {
data = (char**)realloc(data, malloc_size*sizeof(char*));
length = (int*)realloc(length, malloc_size*sizeof(int));
}
}
data[i] = new char[p-buffer];
memcpy(data[i],buffer,p-buffer);
memcpy(data[i], buffer,p-buffer);
length[i] = p-buffer-1;
i++;
}
data[i++] = 0; // put a null at the end
char** real_data = new char*[i];
linelength = new int[i];
while (i--) {real_data[i] = data[i]; linelength[i] = length[i];}
p = new Fl_Pixmap(real_data);
if (data == local_data) {
data = (char**)malloc(i*sizeof(char*));
memcpy(data, local_data, i*sizeof(char*));
length = (int*)malloc(i*sizeof(int));
memcpy(length, local_length, i*sizeof(int));
}
numlines = i;
linelength = length;
p = new Fl_Pixmap(data);
}
pixmap_image::~pixmap_image() {
if (p && p->data) {
char** real_data = (char**)(p->data);
for (int i = 0; real_data[i]; i++) delete[] real_data[i];
delete[] real_data;
free((void*)real_data);
}
delete[] linelength;
free((void*)linelength);
delete p;
}
@ -417,5 +437,5 @@ Fluid_Image *ui_find_image(const char *oldname) {
}
//
// End of "$Id: Fluid_Image.cxx,v 1.7.2.3 2000/06/05 21:20:41 mike Exp $".
// End of "$Id: Fluid_Image.cxx,v 1.7.2.4 2000/06/16 07:08:15 bill Exp $".
//

View File

@ -1,5 +1,5 @@
//
// "$Id: code.cxx,v 1.9.2.7 2000/06/05 21:20:42 mike Exp $"
// "$Id: code.cxx,v 1.9.2.8 2000/06/16 07:08:16 bill Exp $"
//
// Code output routines for the Fast Light Tool Kit (FLTK).
//
@ -76,7 +76,7 @@ const char* unique_id(void* o, const char* type, const char* name, const char* l
const char* n = name;
if (!n || !*n) n = label;
if (n && *n) {
while (!is_id(*n)) n++;
while (*n && !is_id(*n)) n++;
while (is_id(*n)) *q++ = *n++;
}
*q = 0;
@ -405,5 +405,5 @@ void Fl_Type::write_code1() {
void Fl_Type::write_code2() {}
//
// End of "$Id: code.cxx,v 1.9.2.7 2000/06/05 21:20:42 mike Exp $".
// End of "$Id: code.cxx,v 1.9.2.8 2000/06/16 07:08:16 bill Exp $".
//