PERFORCE change 163852 for review
David Forsythe
dforsyth at FreeBSD.org
Tue Jun 9 03:12:28 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=163852
Change 163852 by dforsyth at squirrel on 2009/06/09 03:12:05
Still building parser. Learned how to spell origin.
Affected files ...
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/Makefile#4 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.c#11 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.h#11 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_dep.c#1 add
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_dep.h#1 add
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_file.c#1 add
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_file.h#1 add
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.c#6 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.h#6 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_private.h#6 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.c#3 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.h#3 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb.c#12 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb.h#7 edit
.. //depot/projects/soc2009/dforsyth_libpkg/pkg_info/Makefile#3 edit
.. //depot/projects/soc2009/dforsyth_libpkg/pkg_info/main.c#6 edit
.. //depot/projects/soc2009/dforsyth_libpkg/pkg_info/pkg_info.h#2 edit
Differences ...
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/Makefile#4 (text+ko) ====
@@ -1,7 +1,7 @@
LIB= pkg
INCS= pkg.h
WARNS= 6
-SRCS= pkgdb.c pkg_plist.c pkg.c pkg_util.c
+SRCS= pkgdb.c pkg_plist.c pkg.c pkg_util.c pkg_file.c pkg_dep.c
NO_MAN= yes
.include <bsd.lib.mk>
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.c#11 (text+ko) ====
@@ -3,12 +3,13 @@
#include <string.h>
#include "pkg_util.h"
+#include "pkg_dep.h"
+#include "pkg_file.h"
#include "pkg_plist.h"
#include "pkgdb.h"
#include "pkg_private.h"
#include "pkg.h"
-
/* Create a new pkg. */
struct pkg *
@@ -122,13 +123,13 @@
/* Doesn't work correctly yet. */
char *
-pkg_orgin(struct pkg *p)
+pkg_origin(struct pkg *p)
{
- char *orgin;
+ char *origin;
- orgin = pkg_plist_orgin(p->plist);
+ origin = pkg_plist_origin(p->plist);
- return (orgin);
+ return (origin);
}
/* Temporarily void. */
@@ -142,21 +143,17 @@
}
/* Temporarily char. */
-char *
+struct pkg_file *
pkg_file_list_next(struct pkg *p)
{
struct pkg_file *pf;
- char *file_name;
if (p == NULL)
return (NULL);
pf = pkg_plist_pkg_file_list_next(p->plist);
- if (pf == NULL)
- return (NULL);
- file_name = pkg_file_path(pf);
-
- return (file_name);
+
+ return (pf);
}
/* TODO: Make an note in the manual for libpkg that pkg_free should not be
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.h#11 (text+ko) ====
@@ -1,6 +1,19 @@
#ifndef __PKG_H__
#define __PKG_H__
+/* TODO: Error codes. */
+
+/* pkg_file */
+
+struct pkg_file;
+
+const char *pkg_file_path(struct pkg_file *pf);
+
+const char *pkg_file_md5(struct pkg_file *pf);
+
+
+/* TODO: Get pkg_plist out of here. */
+
/* pkg_plist */
struct pkg_plist;
@@ -27,13 +40,13 @@
char *pkg_cwd(struct pkg *p);
-char *pkg_orgin(struct pkg *p);
+char *pkg_origin(struct pkg *p);
char *pkg_comment(struct pkg *p);
void pkg_file_list_init(struct pkg *p);
-char *pkg_file_list_next(struct pkg *p);
+struct pkg_file *pkg_file_list_next(struct pkg *p);
void pkg_free(struct pkg *p);
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.c#6 (text+ko) ====
@@ -9,6 +9,8 @@
#include <dirent.h>
#include <limits.h>
+#include "pkg_dep.h"
+#include "pkg_file.h"
#include "pkg_plist.h"
#include "pkgdb.h"
#include "pkg.h"
@@ -19,33 +21,26 @@
char *group;
};
-struct pkg_file {
- char *path;
- char *md5;
- char *owner;
- char *group;
-
- TAILQ_ENTRY(pkg_file) next;
-};
-
struct pkg_plist {
- int rev;
+ char * rev;
char *cwd;
char *srcdir;
char *name;
- char *orgin;
+ char *origin;
char *display;
char *mtree_file;
char *text; /* The entire plist */
struct pkg_file *pf_curr;
+ struct pkg_dep *pd_curr;
/* Use these lists here so that appending to our list doesnt need a
* bunch of realloc procedures. This will be convenient for clients
* that want to build plists on the fly, modify plists, etc. */
TAILQ_HEAD(pf_head, pkg_file) pf_head; /* pkg_file list. */
+ TAILQ_HEAD(pd_head, pkg_dep) pd_head; /* pkg_dep list. */
};
void
@@ -77,22 +72,6 @@
return (pl);
}
-struct pkg_file *
-pkg_file_new(char *path, char *md5, char *owner, char *group)
-{
- struct pkg_file *pf;
-
- pf = calloc(1, sizeof(*pf));
- if (pf != NULL) {
- pf->path = path;
- pf->md5 = md5;
- pf->owner = owner;
- pf->group = group;
- }
-
- return (pf);
-}
-
struct pkg_plist *
pkg_plist_parse_contents_from_text(const char *text)
{
@@ -147,11 +126,14 @@
}
/* Parse a command sequence and add an entry based on the findings. */
+
+/* TODO: Add richer return values for parse errors. */
int
pkg_plist_parse_line(struct pkg_plist *pl, char *line,
struct parse_state *st)
{
int s;
+ size_t line_len;
char *command;
char *argument;
char *sep;
@@ -161,6 +143,7 @@
return (-1);
s = 0;
+ line_len = strlen(line);
if (*line == '@') {
sep = strchr(line, ' ');
if (sep == NULL)
@@ -172,10 +155,9 @@
strcmp(command, PLIST_CMD_CD) == 0) {
pl->cwd = argument;
st->last_elem = PLIST_CWD;
- }
- else if (strcmp(command, PLIST_CMD_SRCDIR) == 0) {
+ } else if (strcmp(command, PLIST_CMD_SRCDIR) == 0) {
pl->srcdir = argument;
- return (0);
+ st->last_elem = PLIST_SRCDIR;
}
#if 0
else if (strcmp(command, PLIST_CMD_EXEC) == 0)
@@ -186,15 +168,62 @@
ent = pl_entry_new(PLIST_MODE, argument, NULL);
else if (strcmp(command, PLIST_CMD_OPTION) == 0)
ent = pl_entry_new(PLIST_OPTION, argument, NULL);
- else if (strcmp(command, PLIST_CMD_OWNER) == 0)
- ent = pl_entry_new(PLIST_OWNER, argument, NULL);
- else if (strcmp(command, PLIST_CMD_GROUP) == 0)
- ent = pl_entry_new(PLIST_GROUP, argument, NULL);
#endif
- else if (strcmp(command, PLIST_CMD_COMMENT) == 0) {
+ else if (strcmp(command, PLIST_CMD_OWNER) == 0) {
+ if (line_len == strlen(PLIST_CMD_OWNER) + 1)
+ /* Empty owner line, reset to NULL. */
+ st->owner = NULL;
+ else
+ st->owner = argument;
+
+ st->last_elem = PLIST_OWNER;
+ } else if (strcmp(command, PLIST_CMD_GROUP) == 0) {
+ if (line_len == strlen(PLIST_CMD_OWNER) + 1)
+ /* Empty group line, reset to NULL. */
+ st->owner = NULL;
+ else
+ st->owner = argument;
+
+ st->last_elem = PLIST_GROUP;
+ } else if (strcmp(command, PLIST_CMD_COMMENT) == 0) {
/* Lots more stuff needs to go in here... what a terrible file
* format... */
-
+
+ /* mmm... should probably pull this out into a different
+ * function. */
+ if (line_len == strlen(PLIST_CMD_COMMENT) + 1) {
+ /* Empty comment. */
+ st->last_elem = PLIST_COMMENT;
+ return (0);
+ }
+ sep = strchr(argument, ':');
+ if (sep == NULL) {
+ /* Still not sure what to do with comments that don't have any
+ * effect on the package information. For now, just throw
+ * them out. Maybe later, add a new command that specifies
+ * comments that should be printed when displaying
+ * information from the plist. */
+ return (0);
+ }
+ *sep = '\0';
+ if (strcmp(argument, PLIST_COMMENT_PKG_REV) == 0) {
+ /* TODO: Keeping rev as s string for now. String based
+ * version comparison is dumb, convert to int. */
+ pl->rev = sep + 1;
+ st->last_elem = PLIST_COMMENT;
+ } else if (strcmp(argument, PLIST_COMMENT_ORIGIN) == 0) {
+ pl->origin = sep + 1;
+ st->last_elem = PLIST_COMMENT;
+ } else if (strcmp(argument, PLIST_COMMENT_DEPORIGIN) == 0) {
+ if (st->last_elem != PLIST_PKGDEP)
+ return (1);
+ /* add the the dependency list. */
+ } else if (strcmp(argument, PLIST_COMMENT_MD5) == 0) {
+ if (st->last_elem != PLIST_FILE)
+ return (1);
+ pf = pkg_plist_pkg_file_list_last(pl);
+ pkg_file_set_md5(pf, sep + 1);
+ }
}
#if 0
else if (strcmp(command, PLIST_CMD_NOINST) == 0) {
@@ -208,6 +237,7 @@
#endif
else if (strcmp(command, PLIST_CMD_NAME) == 0) {
pl->name = argument;
+ st->last_elem = PLIST_NAME;
}
#if 0
else if (strcmp(command, PLIST_CMD_DIRRM) == 0)
@@ -215,9 +245,11 @@
#endif
else if (strcmp(command, PLIST_CMD_MTREE) == 0) {
pl->mtree_file = argument;
+ st->last_elem = PLIST_MTREE;
}
else if (strcmp(command, PLIST_CMD_DISPLAY) == 0) {
pl->display = argument;
+ st->last_elem = PLIST_DISPLAY;
}
#if 0
else {
@@ -227,7 +259,7 @@
}
#endif
} else {
- pf = pkg_file_new(line, NULL, NULL, NULL);
+ pf = pkg_file_new(line, NULL, st->owner, st->group);
pkg_plist_pkg_file_list_append(pl, pf);
st->last_elem = PLIST_FILE;
}
@@ -254,33 +286,19 @@
}
char *
-pkg_plist_orgin(struct pkg_plist *pl)
+pkg_plist_origin(struct pkg_plist *pl)
{
if (pl == NULL)
return (NULL);
- return (pl->orgin);
+ return (pl->origin);
}
-/* Will be available. */
-char *
-pkg_file_path(struct pkg_file *pf)
-{
- if (pf == NULL)
- return (NULL);
+/* pkg_file list manipulation and access. */
- return (pf->path);
-}
+/* I should really just write a set of generic routine to handle this
+ * whole mess. */
-char *
-pkg_file_md5(struct pkg_file *pf)
-{
- if (pf == NULL)
- return (NULL);
-
- return (pf->md5);
-}
-
/* Temporarily void. */
void
pkg_plist_pkg_file_list_reset(struct pkg_plist *pl)
@@ -326,6 +344,15 @@
return (TAILQ_FIRST(&pl->pf_head));
}
+struct pkg_file *
+pkg_plist_pkg_file_list_last(struct pkg_plist *pl)
+{
+ if (pl == NULL)
+ return (NULL);
+
+ return (TAILQ_LAST(&pl->pf_head, pf_head));
+}
+
void
pkg_plist_pkg_file_list_append(struct pkg_plist *pl, struct pkg_file *pf)
{
@@ -335,3 +362,4 @@
TAILQ_INSERT_TAIL(&pl->pf_head, pf, next);
}
+/* pkg_dep list manipulation and access. */
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.h#6 (text+ko) ====
@@ -2,6 +2,7 @@
#define __PKG_PLIST_H__
/* Make these visible to the client. */
+
enum plist_elem {
PLIST_CWD,
PLIST_SRCDIR,
@@ -25,6 +26,8 @@
PLIST_UNKNOWN
};
+/* Plist commands. */
+
#define PLIST_CMD_CWD "cwd"
#define PLIST_CMD_CD "cd"
#define PLIST_CMD_SRCDIR "srcdir"
@@ -45,12 +48,14 @@
#define PLIST_CMD_PKGDEG "pkgdep"
#define PLIST_CMD_CONFLICTS "conflicts"
-struct parse_state;
+/* Meta comments. */
-struct pkg_file;
+#define PLIST_COMMENT_PKG_REV "PKG_FORMAT_REVISION"
+#define PLIST_COMMENT_ORIGIN "ORIGIN"
+#define PLIST_COMMENT_DEPORIGIN "DEPORIGIN"
+#define PLIST_COMMENT_MD5 "MD5"
-struct pkg_file *
-pkg_file_new(char *path, char *md5, char *owner, char *group);
+struct parse_state;
struct pkg_plist *pkg_plist_parse_contents_from_text(const char *text);
int pkg_plist_parse_line(struct pkg_plist *pl, char *line,
@@ -61,15 +66,13 @@
char *pkg_plist_name(struct pkg_plist *pl);
char *pkg_plist_cwd(struct pkg_plist *pl);
-char *pkg_plist_orgin(struct pkg_plist *pl);
-
-char *pkg_file_path(struct pkg_file *pf);
-char *pkg_file_md5(struct pkg_file *pf);
+char *pkg_plist_origin(struct pkg_plist *pl);
void pkg_plist_pkg_file_list_init(struct pkg_plist *pl);
struct pkg_file *pkg_plist_pkg_file_list_first(struct pkg_plist *pl);
-void pkg_plist_pkg_file_list_append(struct pkg_plist *pl, struct pkg_file
-*pf);
+struct pkg_file *pkg_plist_pkg_file_list_last(struct pkg_plist *pl);
+void pkg_plist_pkg_file_list_append(struct pkg_plist *pl,
+ struct pkg_file *pf);
void set_parse_state_default(struct parse_state *st);
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_private.h#6 (text+ko) ====
@@ -9,12 +9,11 @@
#define REQUIRED_BY_FILE "+REQUIRED_BY"
struct pkg {
- TAILQ_ENTRY(pkg) next;
-
char *ident; /* User given name for this pkg. */
-
char *comment; /* Mmmmm, should be 70 or less, right? */
struct pkg_plist *plist;
+
+ TAILQ_ENTRY(pkg) next;
};
#endif
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.c#3 (text+ko) ====
@@ -34,3 +34,10 @@
return (new_path);
}
+
+void
+argument_rage_quit(const char *function, const char *message, int ret)
+{
+ fprintf(stderr, "Bad argument in %s: %s\n", function, message);
+ exit(ret);
+}
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.h#3 (text+ko) ====
@@ -6,4 +6,7 @@
int subdir_sel(struct dirent *ent);
char *path_strdup(const char *name);
+void argument_rage_quit(const char *function, const char *message,
+ int ret);
+
#endif
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb.c#12 (text+ko) ====
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb.h#7 (text+ko) ====
==== //depot/projects/soc2009/dforsyth_libpkg/pkg_info/Makefile#3 (text+ko) ====
==== //depot/projects/soc2009/dforsyth_libpkg/pkg_info/main.c#6 (text+ko) ====
@@ -100,7 +100,7 @@
void
print_pkg_information(struct pkg *p)
{
- char *file_name;
+ struct pkg_file *pf;
/* Just print the basic PKGNAME COMMENT scheme right now. Other
* information isn't collected by the library yet. */
@@ -111,11 +111,11 @@
/* Testing plist interaction. */
printf("%s:\n", pkg_name(p));
printf("\tcwd: %s\n", pkg_cwd(p));
- printf("\torgin: %s\n", pkg_orgin(p));
+ printf("\torigin: %s\n", pkg_origin(p));
printf("\tplist:\n");
pkg_file_list_init(p);
- while ((file_name = pkg_file_list_next(p)) != NULL) {
- printf("\t\t%s\n", file_name);
+ while ((pf = pkg_file_list_next(p)) != NULL) {
+ printf("\t\t%s\n\t\t\tMD5: %s\n", pkg_file_path(pf), pkg_file_md5(pf));
}
}
}
==== //depot/projects/soc2009/dforsyth_libpkg/pkg_info/pkg_info.h#2 (text+ko) ====
More information about the p4-projects
mailing list