Add tools/cmpconfig.c to compare to configuration files

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4592 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo
2012-04-11 23:06:30 +00:00
parent f1c5ee72b9
commit 16b8b599a9
10 changed files with 636 additions and 24 deletions
+7 -2
View File
@@ -1,8 +1,8 @@
############################################################################
# Makefile.host
#
# Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
# Copyright (C) 2007, 2008, 2011-2012 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -46,6 +46,11 @@ CFLAGS = -O2 -Wall -I.
mkconfig: mkconfig.c cfgparser.c
@gcc $(CFLAGS) -o mkconfig mkconfig.c cfgparser.c
# cmpconfig - Compare the contents of two configuration files
cmpconfig: cmpconfig.c
@gcc $(CFLAGS) -o cmpconfig cmpconfig.c
# mkversion - Convert a .version file into a C version.h file
mkversion: mkconfig.c cfgparser.c
+20 -11
View File
@@ -19,7 +19,7 @@ configure.sh
mkconfig.c, cfgparser.c, and cfgparser.h
This is C file that is used to build mkconfig program. The mkconfig
These are Cs file that are used to build mkconfig program. The mkconfig
program is used during the initial NuttX build.
When you configure NuttX, you will copy a configuration file called .config
@@ -31,6 +31,11 @@ mkconfig.c, cfgparser.c, and cfgparser.h
into include/nuttx/config.h. config.h is a another version of the
NuttX configuration that can be included by C files.
cmdconfig.c
This C file can be used to build a utility for comparing two NuttX
configuration files.
mkexport.sh and Makefile.export
These implement part of the top-level Makefile's 'export' target. That
@@ -136,10 +141,10 @@ bdf-convert.c
genfontsources:
ifeq ($(CONFIG_NXFONT_SANS23X27),y)
@$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=1 EXTRADEFINES=$(EXTRADEFINES)
@$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=1 EXTRADEFINES=$(EXTRADEFINES)
endif
ifeq ($(CONFIG_NXFONT_MYFONT),y)
@$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=2 EXTRADEFINES=$(EXTRADEFINES)
@$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=2 EXTRADEFINES=$(EXTRADEFINES)
endif
6. nuttx/graphics/nxfonts/Make.defs. Set the make variable NXFSET_CSRCS.
@@ -147,10 +152,10 @@ bdf-convert.c
NXFONTS_FONTID=2:
ifeq ($(CONFIG_NXFONT_SANS23X27),y)
NXFSET_CSRCS += nxfonts_bitmaps_sans23x27.c
NXFSET_CSRCS += nxfonts_bitmaps_sans23x27.c
endif
ifeq ($(CONFIG_NXFONT_MYFONT),y)
NXFSET_CSRCS += nxfonts_bitmaps_myfont.c
NXFSET_CSRCS += nxfonts_bitmaps_myfont.c
endif
7. nuttx/graphics/nxfonts/Makefile.sources. This is the Makefile used
@@ -161,12 +166,12 @@ bdf-convert.c
was used in nuttx/graphics/nxfonts/Make.defs):
ifeq ($(NXFONTS_FONTID),1)
NXFONTS_PREFIX := g_sans23x27_
GEN_CSRC = nxfonts_bitmaps_sans23x27.c
NXFONTS_PREFIX := g_sans23x27_
GEN_CSRC = nxfonts_bitmaps_sans23x27.c
endif
ifeq ($(NXFONTS_FONTID),2)
NXFONTS_PREFIX := g_myfont_
GEN_CSRC = nxfonts_bitmaps_myfont.c
NXFONTS_PREFIX := g_myfont_
GEN_CSRC = nxfonts_bitmaps_myfont.c
endif
8. graphics/nxfonts/nxfonts_bitmaps.c. This is the file that contains
@@ -212,8 +217,12 @@ bdf-convert.c
Makefile.host
This is the makefile that is used to make the mkconfig program from
the mkconfig.c C file, the mkversion program from the mkconfig.c C file,
or the mksyscall program from the mksyscall.c file.
the mkconfig.c C file, the cmpconfig program from cmpconfig.c C file
the mkversion program from the mkconfig.c C file, or the mksyscall
program from the mksyscall.c file. Usage:
cd tools/
make -f Makefile.host <program>
mkromfsimg.sh
+2 -2
View File
@@ -1,8 +1,8 @@
/****************************************************************************
* tools/cfgpaser.c
*
* Copyright (C) 2007-2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
* Copyright (C) 2007-2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
+323
View File
@@ -0,0 +1,323 @@
/****************************************************************************
* tools/cmpconfig.c
*
* Copyright (C) 2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Private Types
****************************************************************************/
struct variable_s
{
struct variable_s *flink;
char *var;
char *val;
char storage[1];
};
/****************************************************************************
* Private Functions
****************************************************************************/
static void show_usage(const char *progname)
{
fprintf(stderr, "USAGE: %s <config1> <config2>\n", progname);
exit(EXIT_FAILURE);
}
static char *skip_space(char *ptr)
{
while (*ptr && isspace((int)*ptr)) ptr++;
return ptr;
}
static char *read_line(FILE *stream, char *line, int len)
{
char *ptr;
for (;;)
{
line[len-1] = '\0';
if (!fgets(line, len, stream))
{
return NULL;
}
else
{
ptr = skip_space(line);
if (*ptr && *ptr != '#' && *ptr != '\n')
{
return ptr;
}
}
}
}
static char *find_name_end(char *ptr)
{
while (*ptr && (isalnum((int)*ptr) || *ptr == '_')) ptr++;
return ptr;
}
static char *find_value_end(char *ptr)
{
while (*ptr && !isspace((int)*ptr))
{
if (*ptr == '"')
{
do ptr++; while (*ptr && *ptr != '"');
if (*ptr) ptr++;
}
else
{
do ptr++; while (*ptr && !isspace((int)*ptr) && *ptr != '"');
}
}
return ptr;
}
static void parse_line(char *ptr, char **varname, char **varval)
{
*varname = ptr;
*varval = NULL;
ptr = find_name_end(ptr);
if (*ptr && *ptr != '=')
{
*ptr = '\0';
ptr = skip_space(ptr + 1);
}
if (*ptr == '=')
{
*ptr = '\0';
ptr = skip_space(ptr + 1);
if (*ptr)
{
*varval = ptr;
ptr = find_value_end(ptr);
*ptr = '\0';
}
}
}
static void parse_file(FILE *stream, struct variable_s **list)
{
char line[10242];
struct variable_s *curr;
struct variable_s *prev;
struct variable_s *next;
char *varname;
char *varval;
char *ptr;
do
{
ptr = read_line(stream, line, 1024);
if (ptr)
{
parse_line(ptr, &varname, &varval);
if (varname)
{
int varlen = strlen(varname) + 1;
int vallen = 0;
if (varval)
{
vallen = strlen(varval) + 1;
}
curr = (struct variable_s *)malloc(sizeof(struct variable_s) + varlen + vallen - 1);
if (curr)
{
curr->var = &curr->storage[0];
strcpy(curr->var, varname);
curr->val = NULL;
if (varval)
{
curr->val = &curr->storage[varlen];
strcpy(curr->val, varval);
}
}
prev = 0;
next = *list;
while (next && strcmp(next->var, curr->var) <= 0)
{
prev = next;
next = next->flink;
}
if (prev)
{
prev->flink = curr;
}
else
{
*list = curr;
}
curr->flink = next;
}
}
}
while (ptr);
}
static void compare_variables(struct variable_s *list1, struct variable_s *list2)
{
char *varval1;
char *varval2;
while (list1 || list2)
{
if (list1->val)
{
varval1 = list1->val;
}
else
{
varval1 = "<NULL>";
}
if (list2->val)
{
varval2 = list2->val;
}
else
{
varval2 = "<NULL>";
}
if (!list1)
{
printf("file1:\n");
printf("file2: %s=%s\n\n", list2->var, varval2);
list2 = list2->flink;
}
else if (!list2)
{
printf("file1: %s=%s\n", list1->var, varval1);
printf("file2:\n\n");
list1 = list1->flink;
}
else
{
int result = strcmp(list1->var, list2->var);
if (result < 0)
{
printf("file1: %s=%s\n", list1->var, varval1);
printf("file2:\n\n");
list1 = list1->flink;
}
else if (result > 0)
{
printf("file1:\n");
printf("file2: %s=%s\n\n", list2->var, varval2);
list2 = list2->flink;
}
else
{
int result = strcmp(varval1, varval2);
if (result != 0)
{
printf("file1: %s=%s\n", list1->var, varval1);
printf("file2: %s=%s\n\n", list2->var, varval2);
}
list1 = list1->flink;
list2 = list2->flink;
}
}
}
}
/****************************************************************************
* Public Functions
****************************************************************************/
int main(int argc, char **argv, char **envp)
{
struct variable_s *list1 = 0;
struct variable_s *list2 = 0;
FILE *stream1;
FILE *stream2;
if (argc != 3)
{
fprintf(stderr, "Unexpected number of arguments: %d\n\n", argc);
show_usage(argv[0]);
}
stream1 = fopen(argv[1], "r");
if (!stream1)
{
fprintf(stderr, "Failed to open %s for reading: %s\n\n",
argv[1], strerror(errno));
show_usage(argv[0]);
}
stream2 = fopen(argv[2], "r");
if (!stream2)
{
fprintf(stderr, "Failed to open %s for reading: %s\n\n",
argv[2], strerror(errno));
show_usage(argv[0]);
}
parse_file(stream1, &list1);
parse_file(stream2, &list2);
fclose(stream1);
fclose(stream2);
printf("Comparing:\n\n");
printf(" file1 = %s\n", argv[1]);
printf(" file2 = %s\n\n", argv[2]);
compare_variables(list1, list2);
return EXIT_SUCCESS;
}
+1 -1
View File
@@ -88,7 +88,7 @@ int main(int argc, char **argv, char **envp)
exit(2);
}
stream= fopen(filepath, "r");
stream = fopen(filepath, "r");
if (!stream)
{
fprintf(stderr, "open %s failed: %s\n", filepath, strerror(errno));