diff --git a/tools/Makefile.host b/tools/Makefile.host index 862f51606d..62733fd073 100644 --- a/tools/Makefile.host +++ b/tools/Makefile.host @@ -78,14 +78,15 @@ all: b16$(HOSTEXEEXT) bdf-converter$(HOSTEXEEXT) cmpconfig$(HOSTEXEEXT) \ configure$(HOSTEXEEXT) mkconfig$(HOSTEXEEXT) mkdeps$(HOSTEXEEXT) \ mksymtab$(HOSTEXEEXT) mksyscall$(HOSTEXEEXT) mkversion$(HOSTEXEEXT) \ cnvwindeps$(HOSTEXEEXT) nxstyle$(HOSTEXEEXT) initialconfig$(HOSTEXEEXT) \ - logparser$(HOSTEXEEXT) gencromfs$(HOSTEXEEXT) convert-comments$(HOSTEXEEXT) + logparser$(HOSTEXEEXT) gencromfs$(HOSTEXEEXT) convert-comments$(HOSTEXEEXT) \ + lowhex$(HOSTEXEEXT) detab$(HOSTEXEEXT) default: mkconfig$(HOSTEXEEXT) mksyscall$(HOSTEXEEXT) mkdeps$(HOSTEXEEXT) \ cnvwindeps$(HOSTEXEEXT) ifdef HOSTEXEEXT .PHONY: b16 bdf-converter cmpconfig clean configure kconfig2html mkconfig \ mkdeps mksymtab mksyscall mkversion cnvwindeps nxstyle initialconfig \ - logparser gencromfs convert-comments + logparser gencromfs convert-comments lowhex detab else .PHONY: clean endif @@ -218,6 +219,24 @@ ifdef HOSTEXEEXT convert-comments: convert-comments$(HOSTEXEEXT) endif +# lowhex - Convert hexadecimal constants to lower cast format + +lowhex$(HOSTEXEEXT): lowhex.c + $(Q) $(HOSTCC) $(HOSTCFLAGS) -o lowhex$(HOSTEXEEXT) lowhex.c + +ifdef HOSTEXEEXT +lowhex: lowhex$(HOSTEXEEXT) +endif + +# detab - Convert tabs to spaces + +detab$(HOSTEXEEXT): detab.c + $(Q) $(HOSTCC) $(HOSTCFLAGS) -o detab$(HOSTEXEEXT) detab.c + +ifdef HOSTEXEEXT +detab: detab$(HOSTEXEEXT) +endif + # cnvwindeps - Convert dependences generated by a Windows native toolchain # for use in a Cygwin/POSIX build environment diff --git a/tools/README.txt b/tools/README.txt index f54c1041c5..ac495c4cf1 100644 --- a/tools/README.txt +++ b/tools/README.txt @@ -74,7 +74,16 @@ convert-comments.c Convert C++-style comments to C89 C-style comments. Usage: - convert-comments + convert-comments + +detab.c +------- + + Convert tabs to spaces in a file. Usage: + + detab [-4] + + Default tab size is 8 spaces; -4 selects 4 space tab size. discover.py ----------- @@ -98,6 +107,13 @@ gencromfs.c be compiled in order to generate the binary CROMFS file system image. +lowhex.c + + Convert hexadecimal representation in a file from upper- to lower-case. + Usage: + + lowhex + mkconfig.c, cfgdefine.c, and cfgdefine.h ---------------------------------------- diff --git a/tools/detab.c b/tools/detab.c new file mode 100644 index 0000000000..9d529cd92b --- /dev/null +++ b/tools/detab.c @@ -0,0 +1,144 @@ +/**************************************************************************** + * tools/detab.c + * + * Copyright (C) 2018 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 + * 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 +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define LINE_SIZE 1024 + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static char g_line[LINE_SIZE]; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +int main(int argc, char **argv, char **envp) +{ + FILE *instream; + FILE *outstream; + const char *infile; + const char *outfile; + int tabsize = 8; + int tabmask = 7; + int newpos; + int pos; + int ret = 1; + int i; + + if (argc == 3) + { + infile = argv[1]; + outfile = argv[2]; + } + else if (argc == 4) + { + if (strcmp(argv[1], "-4") != 0) + { + fprintf(stderr, "ERROR: Unrecognized option\n"); + fprintf(stderr, "Usage: %s [-4] \n", argv[0]); + return 1; + } + + tabsize = 4; + tabmask = 3; + infile = argv[2]; + outfile = argv[3]; + } + else + { + fprintf(stderr, "ERROR: At least two arguments expected\n"); + fprintf(stderr, "Usage: %s [-4] \n", argv[0]); + return 1; + } + + /* Open the source file read-only */ + + instream = fopen(infile, "r"); + if (instream == NULL) + { + fprintf(stderr, "ERROR: Failed to open %s for reading\n", argv[1]); + return 1; + } + + /* Open the destination file write-only */ + + outstream = fopen(outfile, "w"); + if (outstream == NULL) + { + fprintf(stderr, "ERROR: Failed to open %s for reading\n", argv[2]); + goto errout_with_instream; + } + + while (fgets(g_line, LINE_SIZE, instream) != NULL) + { + for (pos = 0, i = 0; g_line[i] && pos < LINE_SIZE && g_line[i]; i++) + { + if (g_line[i] == '\t') + { + newpos = (pos + tabsize) & ~tabmask; + for (; pos < newpos; pos++) + { + fputc(' ', outstream); + } + } + else + { + fputc(g_line[i], outstream); + pos++; + } + } + } + + ret = 0; + + fclose(outstream); + +errout_with_instream: + fclose(instream); + return ret; +} diff --git a/tools/lowhex.c b/tools/lowhex.c new file mode 100644 index 0000000000..e4428bc69b --- /dev/null +++ b/tools/lowhex.c @@ -0,0 +1,160 @@ +/**************************************************************************** + * tools/lowhex.c + * + * Copyright (C) 2018 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 + * 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 +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define LINESIZE 1024 + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static char g_line[LINESIZE]; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static inline bool isdelimiter(int ch) +{ + if (isalnum(ch) || ch == '_') + { + return false; + } + + return true; +} + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +int main(int argc, char **argv) +{ + FILE *instream; + FILE *outstream; + bool delimited; + bool inhex; + int ret = 1; + int i; + int j; + + if (argc != 3) + { + fprintf(stderr, "ERROR: Two arguments expected\n"); + return 1; + } + + /* Open the source file read-only */ + + instream = fopen(argv[1], "r"); + if (instream == NULL) + { + fprintf(stderr, "ERROR: Failed to open %s for reading\n", argv[1]); + return 1; + } + + /* Open the destination file write-only */ + + outstream = fopen(argv[2], "w"); + if (outstream == NULL) + { + fprintf(stderr, "ERROR: Failed to open %s for reading\n", argv[2]); + goto errout_with_instream; + } + + /* Process each line in the file */ + + while ((fgets(g_line, LINESIZE, instream) != NULL)) + { + /* Search for a '0x' that preceding some delimiting character */ + + delimited = true; + inhex = true; + + for (i = 0; + i < LINESIZE && g_line[i] != '\n' && g_line[i] != '\0'; + i++) + { + if (inhex) + { + if (isxdigit(g_line[i])) + { + g_line[i] = tolower(g_line[i]); + } + else + { + inhex = false; + } + } + else if (delimited && g_line[i] == '0') + { + j = i + 1; + if (j < LINESIZE) + { + if (g_line[j] == 'x' || g_line[j] == 'X') + { + g_line[j] = tolower(g_line[j]); + inhex = true; + i = j; + } + } + } + else + { + delimited = isdelimiter(g_line[i]); + } + } + + (void)fputs(g_line, outstream); + } + + ret = 0; + fclose(outstream); + +errout_with_instream: + fclose(instream); + return ret; +}