Revision: 441
http://vde.svn.sourceforge.net/vde/?rev=441&view=rev
Author: rd235
Date: 2010-08-13 13:44:44 +0000 (Fri, 13 Aug 2010)
Log Message:
-----------
bugfix on libvdehist: memory leak. vdehist_create_commandlist rewritten.
Modified Paths:
--------------
trunk/vde-2/src/lib/libvdehist.c
Modified: trunk/vde-2/src/lib/libvdehist.c
===================================================================
--- trunk/vde-2/src/lib/libvdehist.c 2010-08-13 09:10:00 UTC (rev 440)
+++ trunk/vde-2/src/lib/libvdehist.c 2010-08-13 13:44:44 UTC (rev 441)
@@ -142,7 +142,6 @@
#define CC_HEADER 0
#define CC_BODY 1
#define CC_TERM 2
-#define MAX_KEYWORDS 128
static int qstrcmp(const void *a,const void *b)
{
@@ -177,14 +176,18 @@
return linebuf;
}
+/* create the commandlist (from the output of the help command) */
static void vdehist_create_commandlist(int vdefd)
{
char linebuf[BUFSIZE];
- char *localclist[MAX_KEYWORDS];
- int nkeywords=0;
- int i,j;
struct vh_readln readlnbuf={0,0};
- if (vdefd >= 0) {
+ char *buf;
+ size_t bufsize;
+ char *lastcommand=NULL;
+ /* use a memstream to create the array.
+ add (char *) elements by fwrite */
+ FILE *ms=open_memstream(&buf,&bufsize);
+ if (ms && vdefd >= 0) {
int status=CC_HEADER;
vdehist_vdewrite(vdefd,"help\n",5);
while (status != CC_TERM &&
vdehist_readln(vdefd,linebuf,BUFSIZE,&readlnbuf) != NULL) {
@@ -199,34 +202,26 @@
while (*s!=' ' && *s != 0)
s++;
*s=0; /* take the first token */
- localclist[nkeywords]=strdup(linebuf);
- if (nkeywords<MAX_KEYWORDS) nkeywords++;
+ /* test for menu header */
+ if (lastcommand) {
+ if
(strncmp(lastcommand,linebuf,strlen(lastcommand)) == 0 &&
+
linebuf[strlen(lastcommand)] == '/')
+ free(lastcommand);
+ else
+ fwrite(&lastcommand,
sizeof(char *), 1, ms);
+ }
+ lastcommand=strdup(linebuf);
}
}
}
- while (vdehist_readln(vdefd,linebuf,BUFSIZE,&readlnbuf) !=
NULL)
- ;
- qsort(localclist,nkeywords,sizeof(char *),qstrcmp);
- for (i=j=0; i<nkeywords; i++)
- if (i<nkeywords-1 &&
-
strncmp(localclist[i],localclist[i+1],strlen(localclist[i]))==0 &&
- localclist[i+1][strlen(localclist[i])]
== '/') {
- free(localclist[i]); /*avoid menu*/
- } else {
- localclist[j]=localclist[i];
- j++;
- }
- nkeywords=j;
+ if (lastcommand)
+ fwrite(&lastcommand, sizeof(char *), 1, ms);
+ lastcommand = NULL;
+ fwrite(&lastcommand, sizeof(char *), 1, ms);
+ fclose(ms);
+ commandlist=(char **)buf;
+ qsort(commandlist,(bufsize / sizeof(char *))-1,sizeof(char
*),qstrcmp);
}
- nkeywords++;
- commandlist=malloc(nkeywords*sizeof(char *));
- if (commandlist) {
- for (i=0;i<nkeywords;i++)
- commandlist[i]=localclist[i];
- commandlist[i]=NULL;
- }
- //fprintf(stderr,"%d\n",nkeywords);
- //fprintf(stderr,"%s %s\n",commandlist[0],commandlist[1]);
}
static void erase_line(struct vdehiststat *st,int prompt_too)
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
This SF.net email is sponsored by
Make an app they can't live without
Enter the BlackBerry Developer Challenge
http://p.sf.net/sfu/RIM-dev2dev
_______________________________________________
vde-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/vde-users