|
From: <kin...@us...> - 2025-09-17 19:40:18
|
Revision: 7445
http://sourceforge.net/p/teem/code/7445
Author: kindlmann
Date: 2025-09-17 19:40:16 +0000 (Wed, 17 Sep 2025)
Log Message:
-----------
making slow progress on re-write of parsing
Modified Paths:
--------------
teem/trunk/src/hest/CMakeLists-v2.txt
teem/trunk/src/hest/GNUmakefile
teem/trunk/src/hest/argvHest.c
teem/trunk/src/hest/hest.h
teem/trunk/src/hest/test/argv.c
Added Paths:
-----------
teem/trunk/src/hest/test/tparse.c
Modified: teem/trunk/src/hest/CMakeLists-v2.txt
===================================================================
--- teem/trunk/src/hest/CMakeLists-v2.txt 2025-09-17 19:39:05 UTC (rev 7444)
+++ teem/trunk/src/hest/CMakeLists-v2.txt 2025-09-17 19:40:16 UTC (rev 7445)
@@ -1,6 +1,6 @@
_Teem_add_library(${CMAKE_CURRENT_SOURCE_DIR}
SOURCES
- adders.c argvHest.c defaultsHest.c methodsHest.c parseHest.c usage.c
+ adders.c argvHest.c defaultsHest.c methodsHest.c parseHest.c parsest.c usage.c
# private header
privateHest.h
PUBLIC_HEADERS
Modified: teem/trunk/src/hest/GNUmakefile
===================================================================
--- teem/trunk/src/hest/GNUmakefile 2025-09-17 19:39:05 UTC (rev 7444)
+++ teem/trunk/src/hest/GNUmakefile 2025-09-17 19:40:16 UTC (rev 7445)
@@ -46,9 +46,9 @@
$(L).PublicHdr = hest.h
$(L).PrivateHdr = privateHest.h
$(L).Obj = $(patsubst %.c,%.o, \
- adders.c argvHest.c defaultsHest.c methodsHest.c parseHest.c usage.c \
+ adders.c argvHest.c defaultsHest.c methodsHest.c parseHest.c parsest.c usage.c \
)
-$(L).Test = argv ex1 ex2 ex3 ex4 ex5 ex6 strings bday tmpl
+$(L).Test = argv tparse ex1 ex2 ex3 ex4 ex5 ex6 strings bday tmpl
####
####
####
Modified: teem/trunk/src/hest/argvHest.c
===================================================================
--- teem/trunk/src/hest/argvHest.c 2025-09-17 19:39:05 UTC (rev 7444)
+++ teem/trunk/src/hest/argvHest.c 2025-09-17 19:40:16 UTC (rev 7445)
@@ -24,6 +24,16 @@
#define INCR 32
+/* to avoid strict aliasing warnings */
+typedef union {
+ hestArg **harg;
+ hestArgVec **havec;
+ hestInput **hin;
+ void **v;
+} hestPtrPtrUnion;
+
+/* ---------------------- hestArg = harg = hestArg = harg ------------------ */
+
/* dereferences as char *, sets to '\0' */
static void
setNul(void *_c) {
@@ -34,13 +44,12 @@
static void
hargInit(void *_harg) {
- airPtrPtrUnion appu;
- hestArg *harg;
- harg = (hestArg *)_harg;
+ hestArg *harg = (hestArg *)_harg;
harg->str = NULL;
harg->len = 0;
+ airPtrPtrUnion appu;
appu.c = &(harg->str);
- harg->strArr = airArrayNew(appu.v, &(harg->len), 1 /* unit */, INCR);
+ harg->strArr = airArrayNew(appu.v, &(harg->len), sizeof(char), INCR);
airArrayStructCB(harg->strArr, setNul, NULL);
/* initialize with \0 so that harg->str is "" */
airArrayLenIncr(harg->strArr, 1);
@@ -50,23 +59,29 @@
hestArg *
hestArgNew(void) {
- hestArg *harg;
-
- harg = AIR_CALLOC(1, hestArg);
+ hestArg *harg = AIR_CALLOC(1, hestArg);
assert(harg);
hargInit(harg);
return harg;
}
+static void
+hargDone(void *_harg) {
+ hestArg *harg = (hestArg *)_harg;
+ if (harg->str) {
+ /* If caller wants to keep harg->str around,
+ they need to have copied it (the pointer) and set harg->str to NULL */
+ free(harg->str);
+ }
+ airArrayNix(harg->strArr); /* leave the underlying str alone */
+ return;
+}
+
hestArg *
hestArgNix(hestArg *harg) {
if (harg) {
- if (harg->str) {
- /* If caller wants to keep harg->str around,
- they need to have copied it (the pointer) and set harg->str to NULL */
- free(harg->str);
- }
- airArrayNix(harg->strArr); /* leave the underlying str alone */
+ hargDone(harg);
+ free(harg);
}
return NULL;
}
@@ -84,46 +99,46 @@
void
hestArgAddString(hestArg *harg, const char *str) {
assert(harg && str);
- uint len, si;
- len = AIR_UINT(strlen(str));
- for (si = 0; si < len; si++) {
+ uint len = AIR_UINT(strlen(str));
+ for (uint si = 0; si < len; si++) {
hestArgAddChar(harg, str[si]);
}
return;
}
-typedef union {
- hestArg **harg;
- hestArgVec **havec;
- void **v;
-} hestPtrPtrUnion;
+/* ------------------ hestArgVec = havec = hestArgVec = havec -------------- */
hestArgVec *
hestArgVecNew() {
- hestPtrPtrUnion hppu;
- hestArgVec *havec;
- havec = AIR_CALLOC(1, hestArgVec);
+ hestArgVec *havec = AIR_CALLOC(1, hestArgVec);
assert(havec);
havec->harg = NULL;
havec->len = 0;
+ hestPtrPtrUnion hppu;
hppu.harg = &(havec->harg);
- havec->hargArr = airArrayNew(hppu.v, &(havec->len), sizeof(hestArgVec), INCR);
- airArrayStructCB(havec->hargArr, hargInit, NULL);
+ havec->hargArr = airArrayNew(hppu.v, &(havec->len), sizeof(hestArg), INCR);
+ airArrayStructCB(havec->hargArr, hargInit, hargDone);
return havec;
}
+hestArgVec *
+hestArgVecNix(hestArgVec *havec) {
+ assert(havec);
+ airArrayNuke(havec->hargArr);
+ free(havec);
+ return NULL;
+}
+
void
hestArgVecAppendString(hestArgVec *havec, const char *str) {
- uint idx;
- idx = airArrayLenIncr(havec->hargArr, 1);
+ uint idx = airArrayLenIncr(havec->hargArr, 1);
hestArgAddString(havec->harg + idx, str);
}
void
-hestArgVecPrint(const hestArgVec *havec) {
- uint idx;
- printf("hestArgVec %p has %u args:\n", havec, havec->len);
- for (idx = 0; idx < havec->hargArr->len; idx++) {
+hestArgVecPrint(const char *caller, const hestArgVec *havec) {
+ printf("%s: hestArgVec %p has %u args:\n", caller, havec, havec->len);
+ for (uint idx = 0; idx < havec->hargArr->len; idx++) {
const hestArg *harg;
harg = havec->harg + idx;
printf(" %u:<%s>", idx, harg->str);
@@ -131,11 +146,11 @@
printf("\n");
}
-hestInput *
-hestInputNew(void) {
- hestInput *hin;
- hin = AIR_CALLOC(1, hestInput);
- assert(hin);
+/* --------------------- hestInput = hin = hestInput = hin ----------------- */
+
+static void
+hinInit(void *_hin) {
+ hestInput *hin = (hestInput *)_hin;
hin->source = hestSourceUnknown;
hin->dflt = NULL;
hin->argc = 0;
@@ -143,23 +158,97 @@
hin->argIdx = 0;
hin->fname = NULL;
hin->file = NULL;
+ return;
+}
+
+hestInput *
+hestInputNew(void) {
+ hestInput *hin = AIR_CALLOC(1, hestInput);
+ assert(hin);
+ hinInit(hin);
return hin;
}
-#if 0
+static void
+hinDone(void *_hin) {
+ hestInput *hin = (hestInput *)_hin;
+ /* nothing, for now*/
+ AIR_UNUSED(hin);
+ return;
+}
-/* what is the thing we're currently processing to build up the arg vec */
-typedef struct {
- int source; /* from the hestSource* enum */
- /* ------ if source == hestSourceDefault ------ */
- const char *dflt;
- /* ------ if source == hestSourceCommandLine ------ */
- int argc;
- const char **argv;
- unsigned int argIdx;
- /* ------ if source == hestSourceResponseFile ------ */
- char *fname;
- FILE *file;
-} hestInput;
+hestInput *
+hestInputNix(hestInput *hin) {
+ assert(hin);
+ hinDone(hin);
+ free(hin);
+ return NULL;
+}
-#endif
\ No newline at end of file
+hestInputStack *
+hestInputStackNew(void) {
+ hestInputStack *hist = AIR_CALLOC(1, hestInputStack);
+ assert(hist);
+ hist->hin = NULL;
+ hist->len = 0;
+ hestPtrPtrUnion hppu;
+ hppu.hin = &(hist->hin);
+ hist->hinArr = airArrayNew(hppu.v, &(hist->len), sizeof(hestInput), INCR);
+ airArrayStructCB(hist->hinArr, hinInit, hinDone);
+ return hist;
+}
+
+hestInputStack *
+hestInputStackNix(hestInputStack *hist) {
+ assert(hist);
+ airArrayNuke(hist->hinArr);
+ free(hist);
+ return NULL;
+}
+
+void
+hestInputStackPushCommandLine(hestInputStack *hist, int argc, const char **argv) {
+ assert(hist);
+ uint idx = airArrayLenIncr(hist->hinArr, 1);
+ hist->hin[idx].source = hestSourceCommandLine;
+ hist->hin[idx].argc = argc;
+ hist->hin[idx].argv = argv;
+ hist->hin[idx].argIdx = 0;
+ return;
+}
+
+static int
+histProc(hestArgVec *havec, hestInputStack *hist) {
+ hestInput *hinTop = hist->hin + (hist->len - 1);
+ int done = AIR_FALSE;
+ switch (hinTop->source) {
+ case hestSourceDefault:
+ fprintf(stderr, "%s: sorry hestSourceDefault not implemented\n", __func__);
+ done = AIR_TRUE;
+ break;
+ case hestSourceCommandLine:
+ /* argv[] 0 1 2 3 (argc=4) */
+ /* cmd arg1 arg2 arg3 */
+ if (hinTop->argIdx < hinTop->argc) {
+ /* there are args left to parse */
+ hestArgVecAppendString(havec, hinTop->argv[hinTop->argIdx]);
+ hinTop->argIdx++;
+ }
+ done = (hinTop->argIdx == hinTop->argc);
+ break;
+ case hestSourceResponseFile:
+ fprintf(stderr, "%s: sorry hestSourceResponseFile not implemented\n", __func__);
+ done = AIR_TRUE;
+ break;
+ }
+ return done;
+}
+
+int
+hestInputStackProcess(hestArgVec *havec, hestInputStack *hist) {
+ int done;
+ do {
+ done = histProc(havec, hist);
+ } while (!done);
+ return 0;
+}
Modified: teem/trunk/src/hest/hest.h
===================================================================
--- teem/trunk/src/hest/hest.h 2025-09-17 19:39:05 UTC (rev 7444)
+++ teem/trunk/src/hest/hest.h 2025-09-17 19:40:16 UTC (rev 7445)
@@ -145,8 +145,7 @@
/* --------------------- Output
Things set/allocated by hestParse. */
- /* from the hestSource* enum; from whence was this information learned, else
- hestSourceUnknown if not */
+ /* from the hestSource* enum; from whence was this information learned */
int source;
/* if parseStr is non-NULL: a string (freed by hestParseFree) that is a lot like the
string (storing zero or many parameters), from which hestParse ultimately parsed
@@ -231,7 +230,7 @@
/* for building up a "vector" of arguments */
typedef struct {
- hestArg *harg;
+ hestArg *harg; /* array of hestArgs */
unsigned int len;
airArray *hargArr;
} hestArgVec;
@@ -240,16 +239,22 @@
typedef struct {
int source; /* from the hestSource* enum */
/* ------ if source == hestSourceDefault ------ */
- const char *dflt;
+ const char *dflt; /* we do NOT own*/
/* ------ if source == hestSourceCommandLine ------ */
- int argc;
- const char **argv;
+ unsigned int argc;
+ const char **argv; /* we do NOT own */
unsigned int argIdx;
/* ------ if source == hestSourceResponseFile ------ */
- char *fname;
- FILE *file;
+ char *fname; /* we do NOT own */
+ FILE *file; /* someone opened this for us */
} hestInput;
+typedef struct {
+ hestInput *hin; /* array of hestInputs */
+ unsigned int len;
+ airArray *hinArr;
+} hestInputStack;
+
/* defaultsHest.c */
HEST_EXPORT int hestDefaultVerbosity;
HEST_EXPORT int hestDefaultRespFileEnable;
@@ -275,10 +280,21 @@
HEST_EXPORT void hestArgAddChar(hestArg *harg, char cc);
HEST_EXPORT void hestArgAddString(hestArg *harg, const char *str);
HEST_EXPORT hestArgVec *hestArgVecNew(void);
+HEST_EXPORT hestArgVec *hestArgVecNix(hestArgVec *havec);
HEST_EXPORT void hestArgVecAppendString(hestArgVec *havec, const char *str);
-HEST_EXPORT void hestArgVecPrint(const hestArgVec *havec);
+HEST_EXPORT void hestArgVecPrint(const char *caller, const hestArgVec *havec);
HEST_EXPORT hestInput *hestInputNew(void);
+HEST_EXPORT hestInput *hestInputNix(hestInput *hin);
+HEST_EXPORT hestInputStack *hestInputStackNew(void);
+HEST_EXPORT hestInputStack *hestInputStackNix(hestInputStack *hist);
+HEST_EXPORT void hestInputStackPushCommandLine(hestInputStack *hist, int argc,
+ const char **argv);
+HEST_EXPORT int hestInputStackProcess(hestArgVec *havec, hestInputStack *hist);
+/* parsest.c */
+HEST_EXPORT int hestParse2(hestOpt *opt, int argc, const char **argv, char **errP,
+ const hestParm *hparm);
+
/* methodsHest.c */
HEST_EXPORT const int hestPresent;
HEST_EXPORT int hestSourceUser(int src);
Modified: teem/trunk/src/hest/test/argv.c
===================================================================
--- teem/trunk/src/hest/test/argv.c 2025-09-17 19:39:05 UTC (rev 7444)
+++ teem/trunk/src/hest/test/argv.c 2025-09-17 19:40:16 UTC (rev 7445)
@@ -53,19 +53,21 @@
printf("%s: |%s|\n", argv[0], harg->str);
hestArgAddString(harg, "bingo bob lives\n");
printf("%s: |%s|\n", argv[0], harg->str);
+ hestArgNix(harg);
hestArgVec *havec = hestArgVecNew();
- hestArgVecPrint(havec);
+ hestArgVecPrint(argv[0], havec);
hestArgVecAppendString(havec, "this");
- hestArgVecPrint(havec);
+ hestArgVecPrint(argv[0], havec);
hestArgVecAppendString(havec, "is");
- hestArgVecPrint(havec);
+ hestArgVecPrint(argv[0], havec);
hestArgVecAppendString(havec, "totally");
- hestArgVecPrint(havec);
+ hestArgVecPrint(argv[0], havec);
hestArgVecAppendString(havec, "");
- hestArgVecPrint(havec);
+ hestArgVecPrint(argv[0], havec);
hestArgVecAppendString(havec, "bonkers");
- hestArgVecPrint(havec);
+ hestArgVecPrint(argv[0], havec);
+ hestArgVecNix(havec);
exit(0);
}
Added: teem/trunk/src/hest/test/tparse.c
===================================================================
--- teem/trunk/src/hest/test/tparse.c (rev 0)
+++ teem/trunk/src/hest/test/tparse.c 2025-09-17 19:40:16 UTC (rev 7445)
@@ -0,0 +1,31 @@
+/*
+ Teem: Tools to process and visualize scientific data and images
+ Copyright (C) 2009--2023 University of Chicago
+ Copyright (C) 2005--2008 Gordon Kindlmann
+ Copyright (C) 1998--2004 University of Utah
+
+ This library is free software; you can redistribute it and/or modify it under the terms
+ of the GNU Lesser General Public License (LGPL) as published by the Free Software
+ Foundation; either version 2.1 of the License, or (at your option) any later version.
+ The terms of redistributing and/or modifying this software also include exceptions to
+ the LGPL that facilitate static linking.
+
+ This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ You should have received a copy of the GNU Lesser General Public License
+ along with this library; if not, see <https://www.gnu.org/licenses/>.
+*/
+
+#include "../hest.h"
+
+int
+main(int argc, const char **argv) {
+
+ hestOpt *opt = NULL;
+ int res[2];
+ hestOptAdd(&opt, "res", "sx sy", airTypeInt, 2, 2, res, NULL, "image resolution");
+ hestParse2(opt, argc - 1, argv + 1, NULL, NULL);
+
+ exit(0);
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|