update app_match_nuttx for nuttx10.3

This commit is contained in:
wgzAIIT
2022-06-17 17:12:53 +08:00
parent f2355281b1
commit 4ee205876a
71 changed files with 880 additions and 21600 deletions
@@ -1,5 +1,5 @@
############################################################################
# tools/Makefile.unix
# tools/Unix.mk
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
@@ -42,9 +42,12 @@ CONFIG_VERSION_BUILD ?= "0"
VERSION_ARG = -v $(CONFIG_VERSION_STRING) -b $(CONFIG_VERSION_BUILD)
else
# Generate .version every time from GIT history
# Generate .version.tmp every time from GIT history
# Only update .version if the contents of version.tmp actually changes
# Note: this is executed before any rule is run
.PHONY: $(TOPDIR)/.version
$(shell tools/version.sh .version.tmp > /dev/null)
$(shell $(call TESTANDREPLACEFILE, .version.tmp, .version))
endif
# Process architecture specific directories
@@ -155,7 +158,7 @@ endif
BIN = nuttx$(EXEEXT)
all: $(BIN)
.PHONY: dirlinks context clean_context config oldconfig menuconfig nconfig qconfig gconfig export subdir_clean clean subdir_distclean distclean apps_clean apps_distclean
.PHONY: context clean_context config oldconfig menuconfig nconfig qconfig gconfig export subdir_clean clean subdir_distclean distclean apps_clean apps_distclean
.PHONY: pass1 pass1dep
.PHONY: pass2 pass2dep
@@ -182,10 +185,8 @@ NEED_MATH_H = y
endif
ifeq ($(NEED_MATH_H),y)
include/math.h: include/nuttx/lib/math.h .clean_context
include/math.h: include/nuttx/lib/math.h
$(Q) cp -f include/nuttx/lib/math.h include/math.h
else
include/math.h:
endif
# The float.h header file defines the properties of your floating point
@@ -195,10 +196,8 @@ endif
# the settings in this float.h are actually correct for your platform!
ifeq ($(CONFIG_ARCH_FLOAT_H),y)
include/float.h: include/nuttx/lib/float.h .clean_context
include/float.h: include/nuttx/lib/float.h
$(Q) cp -f include/nuttx/lib/float.h include/float.h
else
include/float.h:
endif
# Target used to copy include/nuttx/lib/stdarg.h. If CONFIG_ARCH_STDARG_H is
@@ -207,10 +206,8 @@ endif
# have to copy stdarg.h from include/nuttx/. to include/.
ifeq ($(CONFIG_ARCH_STDARG_H),y)
include/stdarg.h: include/nuttx/lib/stdarg.h .clean_context
include/stdarg.h: include/nuttx/lib/stdarg.h
$(Q) cp -f include/nuttx/lib/stdarg.h include/stdarg.h
else
include/stdarg.h:
endif
# Target used to copy include/nuttx/lib/setjmp.h. If CONFIG_ARCH_SETJMP_H is
@@ -219,10 +216,8 @@ endif
# have to copy setjmp.h from include/nuttx/. to include/.
ifeq ($(CONFIG_ARCH_SETJMP_H),y)
include/setjmp.h: include/nuttx/lib/setjmp.h .clean_context
include/setjmp.h: include/nuttx/lib/setjmp.h
$(Q) cp -f include/nuttx/lib/setjmp.h include/setjmp.h
else
include/setjmp.h:
endif
# Targets used to build include/nuttx/version.h. Creation of version.h is
@@ -239,10 +234,9 @@ $(TOPDIR)/.version:
$(Q) tools/version.sh $(VERSION_ARG) .version
$(Q) chmod 755 .version
include/nuttx/version.h: $(TOPDIR)/.version tools/mkversion$(HOSTEXEEXT) .clean_context
include/nuttx/version.h: $(TOPDIR)/.version tools/mkversion$(HOSTEXEEXT)
$(Q) echo "Create version.h"
$(Q) tools/mkversion $(TOPDIR) > $@.tmp
$(Q) $(call TESTANDREPLACEFILE, $@.tmp, $@)
$(Q) tools/mkversion $(TOPDIR) > $@
# Targets used to build include/nuttx/config.h. Creation of config.h is
# part of the overall NuttX configuration sequence. Notice that the
@@ -251,7 +245,7 @@ include/nuttx/version.h: $(TOPDIR)/.version tools/mkversion$(HOSTEXEEXT) .clean_
tools/mkconfig$(HOSTEXEEXT):
$(Q) $(MAKE) -C tools -f Makefile.host mkconfig$(HOSTEXEEXT)
include/nuttx/config.h: $(TOPDIR)/.config tools/mkconfig$(HOSTEXEEXT) .clean_context
include/nuttx/config.h: $(TOPDIR)/.config tools/mkconfig$(HOSTEXEEXT)
$(Q) tools/mkconfig $(TOPDIR) > $@.tmp
$(Q) $(call TESTANDREPLACEFILE, $@.tmp, $@)
@@ -263,7 +257,7 @@ tools/mkdeps$(HOSTEXEEXT):
tools/cnvwindeps$(HOSTEXEEXT):
$(Q) $(MAKE) -C tools -f Makefile.host cnvwindeps$(HOSTEXEEXT)
# dirlinks, and helpers
# .dirlinks, and helpers
#
# Directories links. Most of establishing the NuttX configuration involves
# setting up symbolic links with 'generic' directory names to specific,
@@ -271,72 +265,152 @@ tools/cnvwindeps$(HOSTEXEEXT):
# Link the arch/<arch-name>/include directory to include/arch
include/arch: .clean_context
@echo "LN: include/arch to $(ARCH_DIR)/include"
$(Q) $(DIRLINK) $(TOPDIR)/$(ARCH_DIR)/include include/arch
$(Q) touch $@
include/arch:
@echo "LN: $@ to $(ARCH_DIR)/include"
$(Q) $(DIRLINK) $(TOPDIR)/$(ARCH_DIR)/include $@
# Link the boards/<arch>/<chip>/<board>/include directory to include/arch/board
include/arch/board: include/arch
@echo "LN: include/arch/board to $(BOARD_DIR)/include"
$(Q) $(DIRLINK) $(BOARD_DIR)/include include/arch/board
$(Q) touch $@
include/arch/board: | include/arch
@echo "LN: $@ to $(BOARD_DIR)/include"
$(Q) $(DIRLINK) $(BOARD_DIR)/include $@
ifneq ($(BOARD_COMMON_DIR),)
# Link the boards/<arch>/<chip>/common dir to arch/<arch-name>/src/board
# Link the boards/<arch>/<chip>/<board>/src dir to arch/<arch-name>/src/board/board
$(ARCH_SRC)/board: .clean_context
@echo "LN: $(ARCH_SRC)/board to $(BOARD_COMMON_DIR)"
$(Q) $(DIRLINK) $(BOARD_COMMON_DIR) $(ARCH_SRC)/board
@echo "LN: $(ARCH_SRC)/board/board to $(BOARD_DIR)/src"
$(Q) $(DIRLINK) $(BOARD_DIR)/src $(ARCH_SRC)/board/board
$(Q) touch $@
ifneq ($(BOARD_COMMON_DIR),)
ARCH_SRC_BOARD_SYMLINK=$(BOARD_COMMON_DIR)
ARCH_SRC_BOARD_BOARD_SYMLINK=$(BOARD_DIR)/src
else
# Link the boards/<arch>/<chip>/<board>/src dir to arch/<arch-name>/src/board
ARCH_SRC_BOARD_SYMLINK=$(BOARD_DIR)/src
endif
$(ARCH_SRC)/board: .clean_context
@echo "LN: $(ARCH_SRC)/board to $(BOARD_DIR)/src"
$(Q) $(DIRLINK) $(BOARD_DIR)/src $(ARCH_SRC)/board
$(Q) touch $@
ifneq ($(ARCH_SRC_BOARD_SYMLINK),)
$(ARCH_SRC)/board:
@echo "LN: $@ to $(ARCH_SRC_BOARD_SYMLINK)"
$(Q) $(DIRLINK) $(ARCH_SRC_BOARD_SYMLINK) $@
endif
ifneq ($(ARCH_SRC_BOARD_BOARD_SYMLINK),)
$(ARCH_SRC)/board/board: | $(ARCH_SRC)/board
@echo "LN: $@ to $(ARCH_SRC_BOARD_BOARD_SYMLINK)"
$(Q) $(DIRLINK) $(ARCH_SRC_BOARD_BOARD_SYMLINK) $@
endif
# Link the boards/<arch>/<chip>/drivers dir to drivers/platform
drivers/platform: .clean_context
@echo "LN: $(TOPDIR)/drivers/platform to $(BOARD_DRIVERS_DIR)"
$(Q) $(DIRLINK) $(BOARD_DRIVERS_DIR) $(TOPDIR)/drivers/platform
$(Q) touch $@
drivers/platform:
@echo "LN: $@ to $(BOARD_DRIVERS_DIR)"
$(Q) $(DIRLINK) $(BOARD_DRIVERS_DIR) $@
# Link arch/<arch-name>/src/<chip-name> to arch/<arch-name>/src/chip
$(ARCH_SRC)/chip: .clean_context
ifeq ($(CONFIG_ARCH_CHIP_CUSTOM),y)
@echo "LN: $(ARCH_SRC)/chip to $(CHIP_DIR)"
$(Q) $(DIRLINK) $(CHIP_DIR) $(ARCH_SRC)/chip
ARCH_SRC_CHIP_SYMLINK_DIR=$(CHIP_DIR)
else ifneq ($(CONFIG_ARCH_CHIP),)
@echo "LN: $(ARCH_SRC)/chip to $(ARCH_SRC)/$(CONFIG_ARCH_CHIP)"
$(Q) $(DIRLINK) $(TOPDIR)/$(ARCH_SRC)/$(CONFIG_ARCH_CHIP) $(ARCH_SRC)/chip
ARCH_SRC_CHIP_SYMLINK_DIR=$(TOPDIR)/$(ARCH_SRC)/$(CONFIG_ARCH_CHIP)
endif
ifneq ($(ARCH_SRC_CHIP_SYMLINK_DIR),)
$(ARCH_SRC)/chip:
@echo "LN: $@ to $(ARCH_SRC_CHIP_SYMLINK_DIR)"
$(Q) $(DIRLINK) $(ARCH_SRC_CHIP_SYMLINK_DIR) $@
endif
$(Q) cp -f $(CHIP_KCONFIG) $(TOPDIR)/arch/dummy/Kconfig
$(Q) touch $@
# Link arch/<arch-name>/include/<chip-name> to include/arch/chip
include/arch/chip: include/arch
ifeq ($(CONFIG_ARCH_CHIP_CUSTOM),y)
@echo "LN: include/arch/chip to $(CHIP_DIR)/include"
$(Q) $(DIRLINK) $(CHIP_DIR)/include include/arch/chip
INCLUDE_ARCH_CHIP_SYMLINK_DIR=$(CHIP_DIR)/include
else ifneq ($(CONFIG_ARCH_CHIP),)
@echo "LN: include/arch/chip to $(ARCH_INC)/$(CONFIG_ARCH_CHIP)"
$(Q) $(DIRLINK) $(TOPDIR)/$(ARCH_INC)/$(CONFIG_ARCH_CHIP) include/arch/chip
INCLUDE_ARCH_CHIP_SYMLINK_DIR=$(TOPDIR)/$(ARCH_INC)/$(CONFIG_ARCH_CHIP)
endif
ifneq ($(INCLUDE_ARCH_CHIP_SYMLINK_DIR),)
include/arch/chip: | include/arch
@echo "LN: $@ to $(INCLUDE_ARCH_CHIP_SYMLINK_DIR)"
$(DIRLINK) $(INCLUDE_ARCH_CHIP_SYMLINK_DIR) $@
endif
# Copy $(CHIP_KCONFIG) to arch/dummy/Kconfig
arch/dummy/Kconfig:
@echo "CP: $@ to $(CHIP_KCONFIG)"
$(Q) cp -f $(CHIP_KCONFIG) $@
# Copy $(BOARD_KCONFIG) to boards/dummy/Kconfig
boards/dummy/Kconfig:
@echo "CP: $@ to $(BOARD_KCONFIG)"
$(Q) cp -f $(BOARD_KCONFIG) $@
DIRLINKS_SYMLINK = \
include/arch \
include/arch/board \
drivers/platform \
DIRLINKS_FILE = \
arch/dummy/Kconfig \
boards/dummy/Kconfig \
ifneq ($(INCLUDE_ARCH_CHIP_SYMLINK_DIR),)
DIRLINKS_SYMLINK += include/arch/chip
endif
ifneq ($(ARCH_SRC_CHIP_SYMLINK_DIR),)
DIRLINKS_SYMLINK += $(ARCH_SRC)/chip
endif
ifneq ($(ARCH_SRC_BOARD_SYMLINK),)
DIRLINKS_SYMLINK += $(ARCH_SRC)/board
endif
ifneq ($(ARCH_SRC_BOARD_BOARD_SYMLINK),)
DIRLINKS_SYMLINK += $(ARCH_SRC)/board/board
endif
ifneq ($(APPDIR),)
DIRLINKS_EXTERNAL_DIRS += $(APPDIR)
endif
# Generate a pattern to build $(DIRLINKS_EXTERNAL_DIRS)
DIRLINKS_EXTERNAL_DEP = $(patsubst %,%/.dirlinks,$(DIRLINKS_EXTERNAL_DIRS))
DIRLINKS_FILE += $(DIRLINKS_EXTERNAL_DEP)
.dirlinks: $(DIRLINKS_FILE) | $(DIRLINKS_SYMLINK)
touch $@
# Pattern rule for $(DIRLINKS_EXTERNAL_DEP)
%/.dirlinks:
$(Q) $(MAKE) -C $(patsubst %/.dirlinks,%,$@) dirlinks
$(Q) touch $@
dirlinks: include/arch include/arch/board include/arch/chip $(ARCH_SRC)/board $(ARCH_SRC)/chip drivers/platform
$(Q) $(MAKE) -C boards dirlinks
$(Q) $(MAKE) -C $(CONFIG_APPS_DIR) dirlinks
# clean_dirlinks
#
# This is part of the distclean target. It removes all symbolic links created by the dirlink target.
# The symlink subfolders need to be removed before the parent symlinks
.PHONY: clean_dirlinks
clean_dirlinks:
$(Q) $(call DELFILE, $(DIRLINKS_FILE))
$(Q) $(call DELFILE, .dirlinks)
$(Q) $(DIRUNLINK) drivers/platform
ifneq ($(INCLUDE_ARCH_CHIP_SYMLINK_DIR),)
$(Q) $(DIRUNLINK) include/arch/chip
endif
$(Q) $(DIRUNLINK) include/arch/board
$(Q) $(DIRUNLINK) include/arch
ifneq ($(ARCH_SRC_BOARD_BOARD_SYMLINK),)
$(Q) $(DIRUNLINK) $(ARCH_SRC)/board/board
endif
ifneq ($(ARCH_SRC_BOARD_SYMLINK),)
$(Q) $(DIRUNLINK) $(ARCH_SRC)/board
endif
ifneq ($(ARCH_SRC_CHIP_SYMLINK_DIR),)
$(Q) $(DIRUNLINK) $(ARCH_SRC)/chip
endif
# context
#
@@ -345,18 +419,43 @@ dirlinks: include/arch include/arch/board include/arch/chip $(ARCH_SRC)/board $(
# the config.h and version.h header files in the include/nuttx directory and
# the establishment of symbolic links to configured directories.
context: include/nuttx/config.h include/nuttx/version.h include/math.h include/float.h include/stdarg.h include/setjmp.h dirlinks
$(Q) mkdir -p staging
$(Q) for dir in $(CONTEXTDIRS) ; do \
$(MAKE) -C $$dir context || exit; \
done
# Generate a pattern to make Directories.mk context
CONTEXTDIRS_DEPS = $(patsubst %,%/.context,$(CONTEXTDIRS))
context: include/nuttx/config.h include/nuttx/version.h .dirlinks $(CONTEXTDIRS_DEPS) | staging
staging:
$(Q) mkdir -p $@
# Pattern rule for $(CONTEXTDIRS_DEPS)
%.context: include/nuttx/config.h .dirlinks
$(Q) $(MAKE) -C $(patsubst %.context,%,$@) TOPDIR="$(TOPDIR)" context
$(Q) touch $@
ifeq ($(NEED_MATH_H),y)
context: include/math.h
endif
ifeq ($(CONFIG_ARCH_FLOAT_H),y)
context: include/float.h
endif
ifeq ($(CONFIG_ARCH_STDARG_H),y)
context: include/stdarg.h
endif
ifeq ($(CONFIG_ARCH_SETJMP_H),y)
context: include/setjmp.h
endif
# clean_context
#
# This is part of the distclean target. It removes all of the header files
# and symbolic links created by the context target.
clean_context:
clean_context: clean_dirlinks
$(Q) for dir in $(CCLEANDIRS) ; do \
if [ -e $$dir/Makefile ]; then \
$(MAKE) -C $$dir clean_context ; \
@@ -369,17 +468,7 @@ clean_context:
$(call DELFILE, include/stdarg.h)
$(call DELFILE, include/setjmp.h)
$(call DELFILE, arch/dummy/Kconfig)
$(Q) $(DIRUNLINK) include/arch/board
$(Q) $(DIRUNLINK) include/arch/chip
$(Q) $(DIRUNLINK) include/arch
$(Q) $(DIRUNLINK) $(ARCH_SRC)/board/board
$(Q) $(DIRUNLINK) $(ARCH_SRC)/board
$(Q) $(DIRUNLINK) $(ARCH_SRC)/chip
$(Q) $(DIRUNLINK) $(TOPDIR)/drivers/platform
.clean_context: .config
+$(Q) $(MAKE) clean_context
$(Q) touch $@
$(call DELFILE, $(CONTEXTDIRS_DEPS))
# Archive targets. The target build sequence will first create a series of
# libraries, one per configured source file directory. The final NuttX
@@ -458,15 +547,18 @@ ifeq ($(CONFIG_UBOOT_UIMAGE),y)
endif
$(call POSTBUILD, $(TOPDIR))
# download
# flash (or download : DEPRECATED)
#
# This is a helper target that will rebuild NuttX and download it to the target
# This is a helper target that will rebuild NuttX and flash it to the target
# system in one step. The operation of this target depends completely upon
# implementation of the DOWNLOAD command in the user Make.defs file. It will
# generate an error if the DOWNLOAD command is not defined.
# implementation of the FLASH command in the user Make.defs file. It will
# generate an error if the FLASH command is not defined.
flash: $(BIN)
$(call FLASH, $<)
download: $(BIN)
$(call DOWNLOAD, $<)
$(call FLASH, $<)
# bootloader
#
@@ -508,25 +600,39 @@ pass2dep: context tools/mkdeps$(HOSTEXEEXT) tools/cnvwindeps$(HOSTEXEEXT)
# location: https://bitbucket.org/nuttx/tools/downloads/. See README.txt
# file in the NuttX tools GIT repository for additional information.
config: apps_preconfig
config:
$(Q) $(MAKE) clean_context
$(Q) $(MAKE) apps_preconfig
$(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-conf Kconfig
oldconfig: apps_preconfig
oldconfig:
$(Q) $(MAKE) clean_context
$(Q) $(MAKE) apps_preconfig
$(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-conf --oldconfig Kconfig
olddefconfig: apps_preconfig
olddefconfig:
$(Q) $(MAKE) clean_context
$(Q) $(MAKE) apps_preconfig
$(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-conf --olddefconfig Kconfig
menuconfig: apps_preconfig
menuconfig:
$(Q) $(MAKE) clean_context
$(Q) $(MAKE) apps_preconfig
$(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-mconf Kconfig
nconfig: apps_preconfig
$(Q) $(MAKE) clean_context
$(Q) $(MAKE) apps_preconfig
$(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-nconf Kconfig
qconfig: apps_preconfig
$(Q) $(MAKE) clean_context
$(Q) $(MAKE) apps_preconfig
$(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-qconf Kconfig
gconfig: apps_preconfig
$(Q) $(MAKE) clean_context
$(Q) $(MAKE) apps_preconfig
$(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-gconf Kconfig
savedefconfig: apps_preconfig
@@ -610,7 +716,6 @@ endif
$(call DELFILE, .config)
$(call DELFILE, .config.old)
$(call DELFILE, .gdbinit)
$(call DELFILE, .clean_context)
$(Q) $(MAKE) -C tools -f Makefile.host clean
# Application housekeeping targets. The APPDIR variable refers to the user
@@ -627,7 +732,7 @@ endif
# apps_distclean: Perform the distclean operation only in the user application
# directory.
apps_preconfig: dirlinks
apps_preconfig: .dirlinks
ifneq ($(APPDIR),)
$(Q) $(MAKE) -C $(APPDIR) preconfig
endif
@@ -22,9 +22,9 @@
* @file cfgdefine.c
* @brief nuttx source code
* https://github.com/apache/incubator-nuttx-apps
* @version 10.2.0
* @version 10.3.0
* @author AIIT XUOS Lab
* @date 2022-03-17
* @date 2022-06-17
*/
/****************************************************************************
@@ -63,12 +63,14 @@ static const char *dequote_list[] =
"CONFIG_INIT_ARGS", /* Argument list of entry point */
"CONFIG_INIT_SYMTAB", /* Global symbol table */
"CONFIG_INIT_NEXPORTS", /* Global symbol table size */
"CONFIG_INIT_ENTRYPOINT", /* Name of entry point function */
"CONFIG_MODLIB_SYMTAB_ARRAY", /* Symbol table array used by modlib functions */
"CONFIG_MODLIB_NSYMBOLS_VAR", /* Variable holding number of symbols in the table */
"CONFIG_PASS1_BUILDIR", /* Pass1 build directory */
"CONFIG_PASS1_TARGET", /* Pass1 build target */
"CONFIG_PASS1_OBJECT", /* Pass1 build object */
"CONFIG_USER_ENTRYPOINT", /* Name of entry point function */
"CONFIG_TTY_LAUNCH_ENTRYPOINT", /* Name of entry point from tty launch */
"CONFIG_TTY_LAUNCH_ARGS", /* Argument list of entry point from tty launch */
/* NxWidgets/NxWM */
@@ -95,7 +97,7 @@ static const char *dequote_list[] =
static char *skip_space(char *ptr)
{
while (*ptr && isspace((int)*ptr)) ptr++;
while (*ptr && isspace(*ptr)) ptr++;
return ptr;
}
@@ -103,7 +105,7 @@ static char *skip_space(char *ptr)
static char *find_name_end(char *ptr)
{
while (*ptr && (isalnum((int)*ptr) || *ptr == '_')) ptr++;
while (*ptr && (isalnum(*ptr) || *ptr == '_')) ptr++;
return ptr;
}
@@ -111,16 +113,16 @@ static char *find_name_end(char *ptr)
static char *find_value_end(char *ptr)
{
while (*ptr && !isspace((int)*ptr))
while (*ptr && !isspace(*ptr))
{
if (*ptr == '"')
{
do ptr++; while (*ptr && *ptr != '"');
do ptr++; while (*ptr && (*ptr != '"' || *(ptr - 1) == '\\'));
if (*ptr) ptr++;
}
else
{
do ptr++; while (*ptr && !isspace((int)*ptr) && *ptr != '"');
do ptr++; while (*ptr && !isspace(*ptr) && *ptr != '"');
}
}
@@ -157,13 +159,7 @@ static char *read_line(FILE *stream)
static void parse_line(char *ptr, char **varname, char **varval)
{
/* Skip over any leading spaces */
ptr = skip_space(ptr);
/* The first no-space is the beginning of the variable name */
*varname = skip_space(ptr);
*varname = ptr;
*varval = NULL;
/* Parse to the end of the variable name */
@@ -359,7 +355,7 @@ void generate_definitions(FILE *stream)
else
{
printf("#define %s %s\n", varname, varval);
printf("#define %s %s\n", &varname[7], varval);
printf("#define %s %s\n", &varname[7], varval);
}
}
}