return (dtsearch(ImageDict, &probe));
}
-static usershape_t *gvusershape_open (char *name)
+#define MAX_USERSHAPE_FILES_OPEN 50
+boolean gvusershape_file_access(usershape_t *us)
{
- usershape_t *us;
+ static int usershape_files_open_cnt;
char *fn;
- if (!ImageDict)
- ImageDict = dtopen(&ImageDictDisc, Dttree);
+ assert(us);
+ assert(us->name);
- if (! (us = gvusershape_find(name))) {
- if (! (us = zmalloc(sizeof(usershape_t))))
- return NULL;
-
- us->name = name;
- if ((fn = safefile(name))) {
+ if (us->f)
+ fseek(us->f, 0, SEEK_SET);
+ else {
+ if ((fn = safefile(us->name))) {
#ifndef WIN32
us->f = fopen(fn, "r");
#else
us->f = fopen(fn, "rb");
#endif
if (us->f == NULL) {
- agerr(AGWARN, "%s while opening %s\n",
- strerror(errno), fn);
- free(us);
- return NULL;
+ agerr(AGWARN, "%s while opening %s\n", strerror(errno), fn);
+ return false;
}
+ if (usershape_files_open_cnt >= MAX_USERSHAPE_FILES_OPEN)
+ us->nocache = true;
+ else
+ usershape_files_open_cnt++;
+ }
+ }
+ return true;
+}
+
+void gvusershape_file_release(usershape_t *us)
+{
+ if (us->nocache) {
+ if (us->f) {
+ fclose(us->f);
+ us->f = NULL;
}
+ }
+}
+
+static usershape_t *gvusershape_open (char *name)
+{
+ usershape_t *us;
+
+ if (!ImageDict)
+ ImageDict = dtopen(&ImageDictDisc, Dttree);
+
+ if (! (us = gvusershape_find(name))) {
+ if (! (us = zmalloc(sizeof(usershape_t))))
+ return NULL;
+
+ us->name = name;
+ if (!gvusershape_file_access(us))
+ return NULL;
+
switch(imagetype(us)) {
case FT_NULL:
if (!(us->data = (void*)find_user_shape(us->name)))
dtinsert(ImageDict, us);
}
+ gvusershape_file_release(us);
+
return us;
}