mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-06 12:36:58 +00:00
use new C-coded version comparison program for bison and flex (bug #2058, with different Makefile changes)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5731 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -17,4 +17,4 @@ update.out
|
|||||||
.tags-sources
|
.tags-sources
|
||||||
tags
|
tags
|
||||||
TAGS
|
TAGS
|
||||||
*.os
|
vercomp
|
||||||
|
81
Makefile
81
Makefile
@@ -20,6 +20,7 @@ OPTIONS=
|
|||||||
# CROSS_COMPILE_BIN=/opt/montavista/pro/devkit/arm/xscale_be/bin/
|
# CROSS_COMPILE_BIN=/opt/montavista/pro/devkit/arm/xscale_be/bin/
|
||||||
# CROSS_COMPILE_TARGET=/opt/montavista/pro/devkit/arm/xscale_be/target
|
# CROSS_COMPILE_TARGET=/opt/montavista/pro/devkit/arm/xscale_be/target
|
||||||
CC=$(CROSS_COMPILE)gcc
|
CC=$(CROSS_COMPILE)gcc
|
||||||
|
HOST_CC=gcc
|
||||||
# CROSS_ARCH=Linux
|
# CROSS_ARCH=Linux
|
||||||
# CROSS_PROC=arm
|
# CROSS_PROC=arm
|
||||||
# SUB_PROC=xscale # or maverick
|
# SUB_PROC=xscale # or maverick
|
||||||
@@ -259,20 +260,10 @@ LIBS+=-lpthread -ldl -lnsl -lsocket -lresolv -L$(CROSS_COMPILE_TARGET)/usr/local
|
|||||||
endif
|
endif
|
||||||
LIBS+=-lssl
|
LIBS+=-lssl
|
||||||
|
|
||||||
#FLEXVER_GT_2_5_31=$(shell ./vercomp.sh flex \>= 2.5.31)
|
|
||||||
#BISONVER=$(shell bison --version | grep \^bison | egrep -o '[0-9]+\.[-0-9.]+[a-z]?' )
|
|
||||||
#BISONVERGE_85=$(shell ./vercomp.sh bison \>= 1.85 )
|
|
||||||
|
|
||||||
ifeq (${FLEXVER_GT_2_5_31},true)
|
|
||||||
FLEXOBJS=ast_expr2.o ast_expr2f.o
|
|
||||||
else
|
|
||||||
FLEXOBJS=ast_expr.o
|
|
||||||
endif
|
|
||||||
|
|
||||||
OBJS=io.o sched.o logger.o frame.o loader.o config.o channel.o \
|
OBJS=io.o sched.o logger.o frame.o loader.o config.o channel.o \
|
||||||
translate.o file.o say.o pbx.o cli.o md5.o term.o \
|
translate.o file.o say.o pbx.o cli.o md5.o term.o \
|
||||||
ulaw.o alaw.o callerid.o fskmodem.o image.o app.o \
|
ulaw.o alaw.o callerid.o fskmodem.o image.o app.o \
|
||||||
cdr.o tdd.o acl.o rtp.o manager.o asterisk.o ${FLEXOBJS} \
|
cdr.o tdd.o acl.o rtp.o manager.o asterisk.o \
|
||||||
dsp.o chanvars.o indications.o autoservice.o db.o privacy.o \
|
dsp.o chanvars.o indications.o autoservice.o db.o privacy.o \
|
||||||
astmm.o enum.o srv.o dns.o aescrypt.o aestab.o aeskey.o \
|
astmm.o enum.o srv.o dns.o aescrypt.o aestab.o aeskey.o \
|
||||||
utils.o config_old.o plc.o jitterbuf.o dnsmgr.o
|
utils.o config_old.o plc.o jitterbuf.o dnsmgr.o
|
||||||
@@ -336,38 +327,54 @@ ifneq ($(wildcard .tags-depend),)
|
|||||||
include .tags-depend
|
include .tags-depend
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: _version
|
.PHONY: _version ast_expr
|
||||||
|
|
||||||
_version:
|
_version:
|
||||||
if [ -d CVS ] && [ ! -f .version ]; then echo $(ASTERISKVERSION) > .version; fi
|
if [ -d CVS ] && [ ! -f .version ]; then echo $(ASTERISKVERSION) > .version; fi
|
||||||
|
|
||||||
.version: _version
|
.version: _version
|
||||||
|
|
||||||
|
vercomp: vercomp.c
|
||||||
|
$(HOST_CC) -o $@ $<
|
||||||
|
|
||||||
|
ast_expr: vercomp
|
||||||
|
$(MAKE) ast_expr.a
|
||||||
|
|
||||||
|
ifeq ($(MAKECMDGOALS),ast_expr.a)
|
||||||
|
FLEXVER_GT_2_5_31=$(shell ./vercomp flex \>= 2.5.31)
|
||||||
|
BISONVER=$(shell bison --version | grep \^bison | sed 's/.* \([0-9]\+\.[-0-9.]\+[a-z]\?\)/\1/' )
|
||||||
|
BISONVER_GE_1_85=$(shell ./vercomp bison \>= 1.85 )
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(FLEXVER_GT_2_5_31),true)
|
||||||
|
FLEXOBJS=ast_expr2.o ast_expr2f.o
|
||||||
|
else
|
||||||
|
FLEXOBJS=ast_expr.o
|
||||||
|
endif
|
||||||
|
|
||||||
|
ast_expr.a: $(FLEXOBJS)
|
||||||
|
@rm -f $@
|
||||||
|
ar r $@ $(FLEXOBJS)
|
||||||
|
ranlib $@
|
||||||
|
|
||||||
.y.c:
|
.y.c:
|
||||||
# @if (($(BISONVERGE_85) = false)); then \
|
@if (($(BISONVER_GE_1_85) = false)); then \
|
||||||
# echo ================================================================================= ;\
|
echo ================================================================================= ;\
|
||||||
# echo NOTE: you may have trouble if you do not have bison-1.85 or higher installed! ;\
|
echo NOTE: You may have trouble if you do not have bison-1.85 or higher installed! ;\
|
||||||
# echo NOTE: you can pick up a copy at: http://ftp.gnu.org/ or its mirrors ;\
|
echo NOTE: You can pick up a copy at: http://ftp.gnu.org/ or its mirrors ;\
|
||||||
# echo NOTE: You Have: $(BISONVER) ;\
|
echo NOTE: You have: $(BISONVER) ;\
|
||||||
# echo ================================================================================; \
|
echo ================================================================================; \
|
||||||
# else \
|
fi
|
||||||
# echo EXCELLENT-- You have Bison version $(BISONVER), this should work just fine...;\
|
|
||||||
# fi
|
|
||||||
bison -v -d --name-prefix=ast_yy $< -o $@
|
bison -v -d --name-prefix=ast_yy $< -o $@
|
||||||
|
|
||||||
ast_expr.o: ast_expr.c
|
ast_expr.o:: ast_expr.c
|
||||||
# @echo NOTE:
|
@echo ================================================================================= ;\
|
||||||
# @echo NOTE:
|
echo NOTE: Using older version of expression parser. To use the newer version, ;\
|
||||||
# @echo NOTE: Using older version of ast_expr. To use the newer version,
|
echo NOTE: upgrade to flex 2.5.31 or higher, which can be found at ;\
|
||||||
# @echo NOTE: Upgrade to flex 2.5.31 or higher, which can be found at http://
|
echo NOTE: http://sourceforge.net/project/showfiles.php?group_id=72099 ;\
|
||||||
# @echo NOTE: http://sourceforge.net/project/showfiles.php?group_id=72099
|
echo ================================================================================= ;\
|
||||||
# @echo NOTE:
|
|
||||||
# @echo NOTE:
|
|
||||||
$(CC) -c $(CPPFLAGS) $(CFLAGS) ast_expr.c
|
|
||||||
|
|
||||||
ast_expr2.o: ast_expr2.c
|
ast_expr.o:: ast_expr.c
|
||||||
|
|
||||||
ast_expr2f.o: ast_expr2f.c
|
|
||||||
|
|
||||||
ast_expr2f.c: ast_expr2.fl
|
ast_expr2f.c: ast_expr2.fl
|
||||||
flex ast_expr2.fl
|
flex ast_expr2.fl
|
||||||
@@ -421,8 +428,8 @@ stdtime/libtime.a: FORCE
|
|||||||
exit 1; \
|
exit 1; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
asterisk: editline/libedit.a db1-ast/libdb1.a stdtime/libtime.a $(OBJS)
|
asterisk: editline/libedit.a db1-ast/libdb1.a stdtime/libtime.a $(OBJS) ast_expr
|
||||||
$(CC) $(DEBUG) -o asterisk $(ASTLINK) $(OBJS) $(LIBEDIT) db1-ast/libdb1.a stdtime/libtime.a $(LIBS)
|
$(CC) $(DEBUG) -o asterisk $(ASTLINK) $(OBJS) ast_expr.a $(LIBEDIT) db1-ast/libdb1.a stdtime/libtime.a $(LIBS)
|
||||||
|
|
||||||
muted: muted.o
|
muted: muted.o
|
||||||
$(CC) -o muted muted.o
|
$(CC) -o muted muted.o
|
||||||
@@ -434,7 +441,9 @@ clean:
|
|||||||
for x in $(SUBDIRS); do $(MAKE) -C $$x clean || exit 1 ; done
|
for x in $(SUBDIRS); do $(MAKE) -C $$x clean || exit 1 ; done
|
||||||
rm -f *.o *.so asterisk .depend
|
rm -f *.o *.so asterisk .depend
|
||||||
rm -f build.h
|
rm -f build.h
|
||||||
rm -f ast_expr.c
|
rm -f ast_expr.c ast_expr.h ast_expr.output
|
||||||
|
rm -f ast_expr2.c ast_expr2f.c ast_expr2.h ast_expr2.output
|
||||||
|
rm -f ast_expr.a vercomp
|
||||||
rm -f .version
|
rm -f .version
|
||||||
rm -f .tags-depend .tags-sources tags TAGS
|
rm -f .tags-depend .tags-sources tags TAGS
|
||||||
@if [ -f editline/Makefile ]; then $(MAKE) -C editline distclean ; fi
|
@if [ -f editline/Makefile ]; then $(MAKE) -C editline distclean ; fi
|
||||||
|
349
vercomp.c
Executable file
349
vercomp.c
Executable file
@@ -0,0 +1,349 @@
|
|||||||
|
/*
|
||||||
|
* Asterisk -- A telephony toolkit for Linux.
|
||||||
|
*
|
||||||
|
* A simple program version comparison tool.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005, 'murf'.
|
||||||
|
*
|
||||||
|
* This program is free software, distributed under the terms of
|
||||||
|
* the GNU General Public License
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* vercomp.c
|
||||||
|
args: <program> <comparison> <version>
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
program = path to program (bison or flex)
|
||||||
|
comparison = ">", "<", "<=", ">=", "=" -- depending on shell, you may have to use backslash escapes
|
||||||
|
version = a version compare against, say 1.875, or 2.5.4, or whatever.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
char *program_version[5];
|
||||||
|
char *arg_version[5];
|
||||||
|
|
||||||
|
void get_program_version_string(char *command, char *output)
|
||||||
|
{
|
||||||
|
char cbuf[8000];
|
||||||
|
char pbuf[8000];
|
||||||
|
char zbuf[8000];
|
||||||
|
char *res;
|
||||||
|
FILE *p1;
|
||||||
|
|
||||||
|
zbuf[0] = 0;
|
||||||
|
|
||||||
|
sprintf( cbuf, "%s --version", command );
|
||||||
|
p1 = popen(cbuf, "r");
|
||||||
|
if( !p1 )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"vercomp: Could not execute the command: %s\n", command);
|
||||||
|
exit(125);
|
||||||
|
}
|
||||||
|
/* the first line is the magic one */
|
||||||
|
res = fgets(zbuf, 8000, p1);
|
||||||
|
/* clear the trailing blank */
|
||||||
|
if( zbuf[strlen(zbuf)-1] == '\n' )
|
||||||
|
zbuf[strlen(zbuf)-1] = 0;
|
||||||
|
/* the rest is cruft, just empty the input stream */
|
||||||
|
while( res )
|
||||||
|
{
|
||||||
|
res = fgets(pbuf, 8000, p1);
|
||||||
|
}
|
||||||
|
/* close the stream. Hopefully, we have what we need */
|
||||||
|
pclose(p1);
|
||||||
|
/* all we want is the last "word"-- so find the last blank, and grab everything after that */
|
||||||
|
|
||||||
|
res = strrchr(zbuf,' ');
|
||||||
|
if( !res )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"Something is wrong with the version string: %s\n", zbuf);
|
||||||
|
exit(124);
|
||||||
|
}
|
||||||
|
strcpy(output,res+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void extract_version(char *ver_string, char **where)
|
||||||
|
{
|
||||||
|
int i=0;
|
||||||
|
char *p=ver_string;
|
||||||
|
|
||||||
|
while( p && *p )
|
||||||
|
{
|
||||||
|
where[i++] = p;
|
||||||
|
p = strchr(p,'.');
|
||||||
|
if( p )
|
||||||
|
{
|
||||||
|
*p= 0;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void compare_versions(char *compare_func)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0;i<5;i++)
|
||||||
|
{
|
||||||
|
/* start out at the beginning, then go to the end */
|
||||||
|
if( program_version[i] && arg_version[i] && *program_version[i] && *arg_version[i] )
|
||||||
|
{
|
||||||
|
|
||||||
|
if( strlen(program_version[i]) == strspn(program_version[i],"0123456789")
|
||||||
|
&& strlen(arg_version[i]) == strspn(arg_version[i],"0123456789") )
|
||||||
|
{
|
||||||
|
/* just pure numbers -- do a numeric compare */
|
||||||
|
int pv = atoi(program_version[i]);
|
||||||
|
int av = atoi(arg_version[i]);
|
||||||
|
|
||||||
|
if( pv < av )
|
||||||
|
{
|
||||||
|
if( !strcmp(compare_func,"=") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">=") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<=") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( pv > av )
|
||||||
|
{
|
||||||
|
if( !strcmp(compare_func,"=") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">=") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<=") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* other junk thrown in -- do string compare */
|
||||||
|
int res = strcmp(program_version[i], arg_version[i]);
|
||||||
|
if( res < 0 ) /* prog is less than arg */
|
||||||
|
{
|
||||||
|
if( !strcmp(compare_func,"=") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">=") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<=") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( res > 0 ) /* prog is greater than arg */
|
||||||
|
{
|
||||||
|
if( !strcmp(compare_func,"=") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">=") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<=") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( program_version[i] && *program_version[i] )
|
||||||
|
{
|
||||||
|
if( !strcmp(compare_func,"=") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">=") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<=") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if( arg_version[i] && *arg_version[i] )
|
||||||
|
{
|
||||||
|
if( !strcmp(compare_func,"=") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">=") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<=") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if( !strcmp(compare_func,"=") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<") )
|
||||||
|
{
|
||||||
|
printf("false\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, ">=") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else if( !strcmp(compare_func, "<=") )
|
||||||
|
{
|
||||||
|
printf("true\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void usage(void)
|
||||||
|
{
|
||||||
|
printf("Usage: <program-path> <comparison> <version>\n\
|
||||||
|
\n\
|
||||||
|
where:\n\
|
||||||
|
\n\
|
||||||
|
program-path = path to program (bison or flex)\n\
|
||||||
|
comparison = '>', '<', '<=', '>=', '=' -- depending on shell, you may have to use backslash escapes\n\
|
||||||
|
version = a version compare against, say 1.875, or 2.5.4, or whatever.\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
char program_version_string[8000];
|
||||||
|
|
||||||
|
/* before starting, check args and make sure all is OK */
|
||||||
|
if( argc < 4 || argc > 4 )
|
||||||
|
{
|
||||||
|
usage();
|
||||||
|
exit(-256);
|
||||||
|
}
|
||||||
|
if ( strcmp(argv[2],"=") && strcmp(argv[2],">") && strcmp(argv[2],"<") && strcmp(argv[2],">=") && strcmp(argv[2],"<=") )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"vercomp: ILLEGAL input Comparison value: %s\n\n", argv[2]);
|
||||||
|
usage();
|
||||||
|
exit(-256);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* first, extract a version from the command line arg */
|
||||||
|
extract_version(argv[3], arg_version);
|
||||||
|
|
||||||
|
/* next, extract a version from the command line */
|
||||||
|
get_program_version_string(argv[1], program_version_string);
|
||||||
|
extract_version(program_version_string, program_version);
|
||||||
|
|
||||||
|
/* next compare and return result */
|
||||||
|
compare_versions(argv[2]);
|
||||||
|
/* the above func shouldn't return */
|
||||||
|
}
|
163
vercomp.sh
163
vercomp.sh
@@ -1,163 +0,0 @@
|
|||||||
#! /bin/bash
|
|
||||||
|
|
||||||
### flex just outputs a single line:
|
|
||||||
|
|
||||||
## flex version 2.5.4
|
|
||||||
|
|
||||||
|
|
||||||
### but bison is a bit more wordy
|
|
||||||
|
|
||||||
## bison (GNU Bison) 1.875c
|
|
||||||
## Written by Robert Corbett and Richard Stallman.
|
|
||||||
##
|
|
||||||
## Copyright (C) 2003 Free Software Foundation, Inc.
|
|
||||||
## This is free software; see the source for copying conditions. There is NO
|
|
||||||
## warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
### based on this, the version number of the program:
|
|
||||||
### a. in the first line of output
|
|
||||||
### b. is the last "word" of that line
|
|
||||||
|
|
||||||
program=$1
|
|
||||||
comparefunc=$2
|
|
||||||
argver=$3
|
|
||||||
|
|
||||||
progver1=`$program --version | head -1`
|
|
||||||
|
|
||||||
[[ $progver1 =~ '([^ ]+$)' ]]
|
|
||||||
|
|
||||||
progver=$BASH_REMATCH
|
|
||||||
|
|
||||||
progver2=$progver
|
|
||||||
numprogverlist=0
|
|
||||||
|
|
||||||
while [[ $progver2 =~ '^([^.]+)\.(.*)' ]]; do
|
|
||||||
progver2=${BASH_REMATCH[2]}
|
|
||||||
progverlist[$numprogverlist]=${BASH_REMATCH[1]}
|
|
||||||
progverlist[$(( ${numprogverlist}+1 ))]=${BASH_REMATCH[2]}
|
|
||||||
|
|
||||||
## echo ${BASH_REMATCH[0]}
|
|
||||||
## echo ${BASH_REMATCH[1]}
|
|
||||||
## echo ${BASH_REMATCH[2]}
|
|
||||||
(( numprogverlist=$(( $numprogverlist+1 )) ))
|
|
||||||
|
|
||||||
done
|
|
||||||
(( numprogverlist=$(( $numprogverlist+1 )) ))
|
|
||||||
|
|
||||||
## echo number of elements = $numprogverlist
|
|
||||||
## echo element 0 = ${progverlist[0]}
|
|
||||||
## echo element 1 = ${progverlist[1]}
|
|
||||||
## echo element 2 = ${progverlist[2]}
|
|
||||||
|
|
||||||
argver2=$argver
|
|
||||||
numargverlist=0
|
|
||||||
|
|
||||||
while [[ $argver2 =~ '^([^.]+)\.(.*)' ]]; do
|
|
||||||
argver2=${BASH_REMATCH[2]}
|
|
||||||
argverlist[$numargverlist]=${BASH_REMATCH[1]}
|
|
||||||
argverlist[$(( ${numargverlist}+1 ))]=${BASH_REMATCH[2]}
|
|
||||||
|
|
||||||
## echo ${BASH_REMATCH[0]}
|
|
||||||
## echo ${BASH_REMATCH[1]}
|
|
||||||
## echo ${BASH_REMATCH[2]}
|
|
||||||
(( numargverlist=$(( $numargverlist+1 )) ))
|
|
||||||
|
|
||||||
done
|
|
||||||
(( numargverlist=$(( $numargverlist+1 )) ))
|
|
||||||
|
|
||||||
## echo number of argver elements = $numargverlist
|
|
||||||
## echo element 0 = ${argverlist[0]}
|
|
||||||
## echo element 1 = ${argverlist[1]}
|
|
||||||
## echo element 2 = ${argverlist[2]}
|
|
||||||
|
|
||||||
if (( $numprogverlist < $numargverlist )); then
|
|
||||||
for (( i=$numprogverlist ; $i < $numargverlist ; i=$i + 1 )) ; do
|
|
||||||
## echo setting progverlist "[" $i "]" to 0
|
|
||||||
(( progverlist[$i]='0' ))
|
|
||||||
(( numprogverlist=${numprogverlist}+1 ))
|
|
||||||
done
|
|
||||||
elif (( $numargverlist < $numprogverlist )); then
|
|
||||||
for (( i=$numargverlist ; $i < $numprogverlist ; i=$i + 1 )) ; do
|
|
||||||
## echo setting argverlist "[" $i "]" to 0
|
|
||||||
(( argverlist[$i]='0' ))
|
|
||||||
(( numargverlist=${numargverlist}+1 ))
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
## echo numarg=$numargverlist numprog=$numprogverlist
|
|
||||||
## echo arg0: ${argverlist[0]}
|
|
||||||
## echo arg1: ${argverlist[1]}
|
|
||||||
## echo arg2: ${argverlist[2]}
|
|
||||||
## echo prog0: ${progverlist[0]}
|
|
||||||
## echo prog1: ${progverlist[1]}
|
|
||||||
## echo prog2: ${progverlist[2]}
|
|
||||||
|
|
||||||
## the main comparison loop
|
|
||||||
|
|
||||||
for (( i=0 ; $i < $numargverlist ; i=$i + 1 )) ; do
|
|
||||||
## echo i= $i
|
|
||||||
|
|
||||||
if [[ ${progverlist[$i]} =~ '^[0-9]+$' && ${argverlist[$i]} =~ '^[0-9]+$' ]] ; then ## nothing but numbers
|
|
||||||
if (( ${progverlist[$i]} != ${argverlist[$i]} )); then
|
|
||||||
if [[ ${progverlist[$i]} -lt ${argverlist[$i]} ]]; then
|
|
||||||
if [[ $comparefunc == "=" ]]; then
|
|
||||||
echo "false"
|
|
||||||
exit 0;
|
|
||||||
elif [[ $comparefunc == "<" || $comparefunc == "<=" ]]; then
|
|
||||||
echo "true"
|
|
||||||
exit 0;
|
|
||||||
elif [[ $comparefunc == ">" || $comparefunc == ">=" ]]; then
|
|
||||||
echo "false"
|
|
||||||
exit 0;
|
|
||||||
fi
|
|
||||||
elif [[ ${progverlist[$i]} -gt ${argverlist[$i]} ]]; then
|
|
||||||
if [[ $comparefunc == "=" ]]; then
|
|
||||||
echo "false"
|
|
||||||
exit 0;
|
|
||||||
elif [[ $comparefunc == "<" || $comparefunc == "<=" ]]; then
|
|
||||||
echo "false"
|
|
||||||
exit 0;
|
|
||||||
elif [[ $comparefunc == ">" || $comparefunc == ">=" ]]; then
|
|
||||||
echo "true"
|
|
||||||
exit 0;
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else ## something besides just numbers
|
|
||||||
if [[ ${progverlist[$i]} != ${argverlist[$i]} ]]; then
|
|
||||||
if [[ ${progverlist[$i]} < ${argverlist[$i]} ]]; then
|
|
||||||
if [[ $comparefunc == "=" ]]; then
|
|
||||||
echo "false"
|
|
||||||
exit 0;
|
|
||||||
elif [[ $comparefunc == "<" || $comparefunc == "<=" ]]; then
|
|
||||||
echo "true"
|
|
||||||
exit 0;
|
|
||||||
elif [[ $comparefunc == ">" || $comparefunc == ">=" ]]; then
|
|
||||||
echo "false"
|
|
||||||
exit 0;
|
|
||||||
fi
|
|
||||||
elif [[ ${progverlist[$i]} > ${argverlist[$i]} ]]; then
|
|
||||||
if [[ $comparefunc == "=" ]]; then
|
|
||||||
echo "false"
|
|
||||||
exit 0;
|
|
||||||
elif [[ $comparefunc == "<" || $comparefunc == "<=" ]]; then
|
|
||||||
echo "false"
|
|
||||||
exit 0;
|
|
||||||
elif [[ $comparefunc == ">" || $comparefunc == ">=" ]]; then
|
|
||||||
echo "true"
|
|
||||||
exit 0;
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ $comparefunc == "=" ]]; then
|
|
||||||
echo "true"
|
|
||||||
elif [[ $comparefunc == "<=" || $comparefunc == ">=" ]]; then
|
|
||||||
echo "true"
|
|
||||||
else
|
|
||||||
echo "false"
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0;
|
|
Reference in New Issue
Block a user