summaryrefslogtreecommitdiff
path: root/recipes/lemon
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/lemon')
-rw-r--r--recipes/lemon/files/lemon.163
-rw-r--r--recipes/lemon/files/snprintf.patch94
-rw-r--r--recipes/lemon/lemon-native_3.5.4.bb11
-rw-r--r--recipes/lemon/lemon.inc15
-rw-r--r--recipes/lemon/lemon_3.5.4.bb11
5 files changed, 194 insertions, 0 deletions
diff --git a/recipes/lemon/files/lemon.1 b/recipes/lemon/files/lemon.1
new file mode 100644
index 0000000000..914ee07013
--- /dev/null
+++ b/recipes/lemon/files/lemon.1
@@ -0,0 +1,63 @@
+.Dd 2002-10-04
+.Dt LEMON 1
+.Os "Debian GNU/Linux"
+.\" Manual page created by Guus Sliepen <guus@debian.org>
+.Sh NAME
+.Nm lemon
+.Nd The Lemon Parser Generator
+.Sh SYNOPSIS
+.Nm
+.Op Fl bcgmqsx
+.Ar input
+.Sh DESCRIPTION
+.Nm
+is an LALR(1) parser generator for C or C++.
+It does the same job as bison and yacc.
+But
+.Nm
+is not another bison or yacc clone.
+It uses a different grammar syntax which is designed to reduce the number of coding errors.
+.Nm
+also uses a more sophisticated parsing engine that is faster than yacc and bison
+and which is both reentrant and thread-safe.
+Furthermore,
+.Nm
+implements features that can be used to eliminate resource leaks,
+making is suitable for use in long-running programs such as graphical user interfaces or embedded controllers.
+.Pp
+.Nm
+will read the grammer from
+.Ar input
+and write out a parser for that grammar in the C language.
+.Sh OPTIONS
+.Bl -tag -width indent
+.It Fl b
+Print only the basis in report.
+.It Fl c
+Don't compress the action table.
+.It Fl g
+Print grammar without actions.
+.It Fl m
+Output a makeheaders compatible file.
+.It Fl q
+(Quiet) Don't print the report file.
+.It Fl s
+Print parser stats to standard output.
+.It Fl x
+Print the version number.
+.El
+.Sh FILES
+.Bl -tag -width indent
+.It Pa /usr/share/lemon/lempar.c
+Driver template for the
+.Nm
+parser generator.
+.El
+.Sh AUTHOR
+.Nm
+has been written by
+.An D. Richard Hipp Aq drh@hwaci.com .
+.Pp
+This manual page was written by
+.An Guus Sliepen Aq guus@debian.org
+for the Debian GNU/Linux system.
diff --git a/recipes/lemon/files/snprintf.patch b/recipes/lemon/files/snprintf.patch
new file mode 100644
index 0000000000..5ce1324f82
--- /dev/null
+++ b/recipes/lemon/files/snprintf.patch
@@ -0,0 +1,94 @@
+--- lemon.c 2004-04-24 14:59:13.000000000 +0200
++++ lemon.c 2004-07-27 15:31:40.000000000 +0200
+@@ -1272,15 +1272,15 @@
+ va_start(ap, format);
+ /* Prepare a prefix to be prepended to every output line */
+ if( lineno>0 ){
+- sprintf(prefix,"%.*s:%d: ",PREFIXLIMIT-10,filename,lineno);
++ snprintf(prefix,sizeof prefix,"%.*s:%d: ",PREFIXLIMIT-10,filename,lineno);
+ }else{
+- sprintf(prefix,"%.*s: ",PREFIXLIMIT-10,filename);
++ snprintf(prefix,sizeof prefix,"%.*s: ",PREFIXLIMIT-10,filename);
+ }
+ prefixsize = strlen(prefix);
+ availablewidth = LINEWIDTH - prefixsize;
+
+ /* Generate the error message */
+- vsprintf(errmsg,format,ap);
++ vsnprintf(errmsg,sizeof errmsg,format,ap);
+ va_end(ap);
+ errmsgsize = strlen(errmsg);
+ /* Remove trailing '\n's from the error message. */
+@@ -2675,7 +2675,7 @@
+ while( cfp ){
+ char buf[20];
+ if( cfp->dot==cfp->rp->nrhs ){
+- sprintf(buf,"(%d)",cfp->rp->index);
++ snprintf(buf,sizeof buf,"(%d)",cfp->rp->index);
+ fprintf(fp," %5s ",buf);
+ }else{
+ fprintf(fp," ");
+@@ -2721,7 +2721,7 @@
+ c = *cp;
+ *cp = 0;
+ path = (char *)malloc( strlen(argv0) + strlen(name) + 2 );
+- if( path ) sprintf(path,"%s/%s",argv0,name);
++ if( path ) snprintf(path,sizeof path,"%s/%s",argv0,name);
+ *cp = c;
+ }else{
+ extern char *getenv();
+@@ -2734,7 +2734,7 @@
+ if( cp==0 ) cp = &pathlist[strlen(pathlist)];
+ c = *cp;
+ *cp = 0;
+- sprintf(path,"%s/%s",pathlist,name);
++ snprintf(path,sizeof path,"%s/%s",pathlist,name);
+ *cp = c;
+ if( c==0 ) pathlist = "";
+ else pathlist = &cp[1];
+@@ -2814,14 +2814,16 @@
+
+ cp = strrchr(lemp->filename,'.');
+ if( cp ){
+- sprintf(buf,"%.*s.lt",(int)(cp-lemp->filename),lemp->filename);
++ snprintf(buf,sizeof buf,"%.*s.lt",(int)(cp-lemp->filename),lemp->filename);
+ }else{
+- sprintf(buf,"%s.lt",lemp->filename);
++ snprintf(buf,sizeof buf,"%s.lt",lemp->filename);
+ }
+ if( access(buf,004)==0 ){
+ tpltname = buf;
+ }else if( access(templatename,004)==0 ){
+ tpltname = templatename;
++ }else if( access("/usr/share/lemon/lempar.c",004)==0 ){
++ tpltname = "/usr/share/lemon/lempar.c";
+ }else{
+ tpltname = pathsearch(lemp->argv0,templatename,0);
+ }
+@@ -2833,7 +2835,7 @@
+ }
+ in = fopen(tpltname,"r");
+ if( in==0 ){
+- fprintf(stderr,"Can't open the template file \"%s\".\n",templatename);
++ fprintf(stderr,"Can't open the template file \"%s\".\n",tpltname);
+ lemp->errorcnt++;
+ return 0;
+ }
+@@ -3447,7 +3449,7 @@
+ /* Generate a table containing the symbolic name of every symbol
+ */
+ for(i=0; i<lemp->nsymbol; i++){
+- sprintf(line,"\"%s\",",lemp->symbols[i]->name);
++ snprintf(line,sizeof line,"\"%s\",",lemp->symbols[i]->name);
+ fprintf(out," %-15s",line);
+ if( (i&3)==3 ){ fprintf(out,"\n"); lineno++; }
+ }
+@@ -3562,7 +3564,7 @@
+ in = file_open(lemp,".h","r");
+ if( in ){
+ for(i=1; i<lemp->nterminal && fgets(line,LINESIZE,in); i++){
+- sprintf(pattern,"#define %s%-30s %2d\n",prefix,lemp->symbols[i]->name,i);
++ snprintf(pattern,sizeof pattern,"#define %s%-30s %2d\n",prefix,lemp->symbols[i]->name,i);
+ if( strcmp(line,pattern) ) break;
+ }
+ fclose(in);
diff --git a/recipes/lemon/lemon-native_3.5.4.bb b/recipes/lemon/lemon-native_3.5.4.bb
new file mode 100644
index 0000000000..55a083ccb7
--- /dev/null
+++ b/recipes/lemon/lemon-native_3.5.4.bb
@@ -0,0 +1,11 @@
+require lemon.inc
+
+PR = "r0"
+
+inherit native
+
+do_stage() {
+ install -d ${STAGING_BINDIR}
+ install -m 0755 lemon ${STAGING_BINDIR}
+ install -m 0644 lempar.c ${STAGING_BINDIR}
+}
diff --git a/recipes/lemon/lemon.inc b/recipes/lemon/lemon.inc
new file mode 100644
index 0000000000..7742fb8118
--- /dev/null
+++ b/recipes/lemon/lemon.inc
@@ -0,0 +1,15 @@
+DESCRIPTION = "The Lemon Parser Generator"
+HOMEPAGE = "http://www.hwaci.com/sw/lemon/"
+LICENSE = "PD"
+PRIORITY = "optional"
+SECTION = "devel"
+
+SRC_URI = "http://www.sqlite.org/sqlite-${PV}.tar.gz \
+ file://lemon.1"
+
+S = "${WORKDIR}/sqlite-${PV}/tool"
+
+do_compile() {
+ ${CC} ${CFLAGS} lemon.c -c -o lemon.o
+ ${CCLD} ${LDFLAGS} lemon.o -o lemon
+}
diff --git a/recipes/lemon/lemon_3.5.4.bb b/recipes/lemon/lemon_3.5.4.bb
new file mode 100644
index 0000000000..4a7e5e77f0
--- /dev/null
+++ b/recipes/lemon/lemon_3.5.4.bb
@@ -0,0 +1,11 @@
+require lemon.inc
+
+PR = "r0"
+
+do_install() {
+ install -d ${D}${bindir}
+ install -m 0755 lemon ${D}${bindir}
+ install -m 0644 lempar.c ${D}${bindir}
+ install -d ${D}${mandir}/man1
+ install -m 0644 ${WORKDIR}/lemon.1 ${D}${mandir}/man1/
+}