projects
/
project
/
uci.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
major code refactoring for more code reuse and smaller code size
[project/uci.git]
/
libuci.c
diff --git
a/libuci.c
b/libuci.c
index
c3a8fc0
..
92205e8
100644
(file)
--- a/
libuci.c
+++ b/
libuci.c
@@
-21,7
+21,7
@@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
-#include "
lib
uci.h"
+#include "uci.h"
#define DEBUG
#include "err.h"
#define DEBUG
#include "err.h"
@@
-31,6
+31,7
@@
static const char *uci_errstr[] = {
[UCI_ERR_MEM] = "Out of memory",
[UCI_ERR_INVAL] = "Invalid argument",
[UCI_ERR_NOTFOUND] = "Entry not found",
[UCI_ERR_MEM] = "Out of memory",
[UCI_ERR_INVAL] = "Invalid argument",
[UCI_ERR_NOTFOUND] = "Entry not found",
+ [UCI_ERR_IO] = "I/O error",
[UCI_ERR_PARSE] = "Parse error",
[UCI_ERR_UNKNOWN] = "Unknown error",
};
[UCI_ERR_PARSE] = "Parse error",
[UCI_ERR_UNKNOWN] = "Unknown error",
};
@@
-42,7
+43,7
@@
static const char *uci_errstr[] = {
static void *uci_malloc(struct uci_context *ctx, size_t size)
{
void *ptr;
static void *uci_malloc(struct uci_context *ctx, size_t size)
{
void *ptr;
-
+
ptr = malloc(size);
if (!ptr)
UCI_THROW(ctx, UCI_ERR_MEM);
ptr = malloc(size);
if (!ptr)
UCI_THROW(ctx, UCI_ERR_MEM);
@@
-63,25
+64,52
@@
static void *uci_realloc(struct uci_context *ctx, void *ptr, size_t size)
return ptr;
}
return ptr;
}
+/*
+ * UCI wrapper for strdup, which uses exception handling
+ */
+static char *uci_strdup(struct uci_context *ctx, const char *str)
+{
+ char *ptr;
+
+ ptr = strdup(str);
+ if (!ptr)
+ UCI_THROW(ctx, UCI_ERR_MEM);
+
+ return ptr;
+}
+
#include "list.c"
#include "list.c"
-#include "
pars
e.c"
+#include "
fil
e.c"
/* externally visible functions */
struct uci_context *uci_alloc(void)
{
struct uci_context *ctx;
/* externally visible functions */
struct uci_context *uci_alloc(void)
{
struct uci_context *ctx;
-
+
ctx = (struct uci_context *) malloc(sizeof(struct uci_context));
memset(ctx, 0, sizeof(struct uci_context));
ctx = (struct uci_context *) malloc(sizeof(struct uci_context));
memset(ctx, 0, sizeof(struct uci_context));
-
+ uci_list_init(&ctx->root);
+
return ctx;
}
return ctx;
}
+void uci_free(struct uci_context *ctx)
+{
+ struct uci_element *e, *tmp;
+
+ uci_cleanup(ctx);
+ uci_foreach_element_safe(&ctx->root, tmp, e) {
+ uci_free_package(uci_to_package(e));
+ }
+ free(ctx);
+ return;
+}
+
int uci_cleanup(struct uci_context *ctx)
{
UCI_HANDLE_ERR(ctx);
int uci_cleanup(struct uci_context *ctx)
{
UCI_HANDLE_ERR(ctx);
- uci_
pars
e_cleanup(ctx);
+ uci_
fil
e_cleanup(ctx);
return 0;
}
return 0;
}
@@
-93,14
+121,14
@@
void uci_perror(struct uci_context *ctx, const char *str)
err = UCI_ERR_INVAL;
else
err = ctx->errno;
err = UCI_ERR_INVAL;
else
err = ctx->errno;
-
+
if ((err < 0) || (err >= UCI_ERR_LAST))
err = UCI_ERR_UNKNOWN;
switch (err) {
case UCI_ERR_PARSE:
if (ctx->pctx) {
if ((err < 0) || (err >= UCI_ERR_LAST))
err = UCI_ERR_UNKNOWN;
switch (err) {
case UCI_ERR_PARSE:
if (ctx->pctx) {
- fprintf(stderr, "%s: %s
at line %d, byte %d\n", str, uci_errstr[err]
, ctx->pctx->line, ctx->pctx->byte);
+ fprintf(stderr, "%s: %s
(%s) at line %d, byte %d\n", str, uci_errstr[err], (ctx->pctx->reason ? ctx->pctx->reason : "unknown")
, ctx->pctx->line, ctx->pctx->byte);
break;
}
/* fall through */
break;
}
/* fall through */