PERFORCE change 123552 for review
Garrett Cooper
gcooper at FreeBSD.org
Sun Jul 15 20:19:40 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=123552
Change 123552 by gcooper at optimus-revised_pkgtools on 2007/07/15 20:19:06
Trying to optimize pkg_version. It's broken for now..
perform.old.c is the backed up version of pkg_version's perform.c.
Affected files ...
.. //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/version/perform.c#2 edit
.. //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/version/perform.old.c#1 add
.. //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/version/version.h#2 edit
Differences ...
==== //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/version/perform.c#2 (text+ko) ====
@@ -194,9 +194,8 @@
ch = NULL;
if (ch == NULL)
errx(2, "The INDEX does not appear to be valid!");
- if ((ie = malloc(sizeof(struct index_entry))) == NULL)
+ if ( (ie = calloc(1, sizeof(struct index_entry))) == NULL )
errx(2, "Unable to allocate memory in %s.", __func__);
- bzero(ie, sizeof(struct index_entry));
ie->name = strdup(tmp);
ie->origin = strdup(&ch[1]);
/* Who really cares if we reverse the index... */
@@ -326,77 +325,122 @@
}
int
-version_match(char *pattern, const char *pkgname)
+version_match(const char *pattern, const char *pkgname)
{
+
+ typedef enum { EXACT_PACKAGENAME=0, PATTERN, UNDEF } search_type_e;
+ typedef enum { UNDETECTED_STREAM=-1, URL, LOCALFILE, STDIN } inputstream_type_e;
+
+ search_type_e trial_index;
+ inputstream_type_e matchstream = UNDETECTED_STREAM;
+
int ret = 0;
- int matchstream = 0;
+
FILE *fp = NULL;
- Boolean isTMP = FALSE;
+
+ const char *trial_strings[] = { pkgname, pattern, NULL };
+ search_type_e trial_categories[] = { EXACT_PACKAGENAME, PATTERN, UNDEF };
+
+ for(trial_index = EXACT_PACKAGENAME; trial_categories[trial_index] != UNDEF; trial_index++) {
+
+ /** URL provided file? **/
+ if (isURL(trial_strings[trial_index])) {
+ fp = fetchGetURL(trial_strings[trial_index], "");
+ if (fp == NULL)
+ errx(2, "Can't open %s.", trial_strings[trial_index]);
+ matchstream = URL;
+ }
+ /** Open file? **/
+ else if (*trial_strings[trial_index] == '/') {
+ fp = fopen(trial_strings[trial_index], "r");
+ if (fp == NULL)
+ errx(2, "Unable to open %s.", trial_strings[trial_index]);
+ matchstream = LOCALFILE;
+ }
+ /** Check for STDIN provided input **/
+ else if (strcmp(trial_strings[trial_index], "-") == 0) {
+ fp = stdin;
+ matchstream = STDIN;
+ }
+
+ if(matchstream != UNDETECTED_STREAM)
+ break;
+
+ }
- if (isURL(pkgname)) {
- fp = fetchGetURL(pkgname, "");
- isTMP = TRUE;
- matchstream = 1;
- if (fp == NULL)
- errx(2, "Unable to open %s.", pkgname);
- } else if (pkgname[0] == '/') {
- fp = fopen(pkgname, "r");
- isTMP = TRUE;
- matchstream = 1;
- if (fp == NULL)
- errx(2, "Unable to open %s.", pkgname);
- } else if (strcmp(pkgname, "-") == 0) {
- fp = stdin;
- matchstream = 1;
- } else if (isURL(pattern)) {
- fp = fetchGetURL(pattern, "");
- isTMP = TRUE;
- matchstream = -1;
- if (fp == NULL)
- errx(2, "Unable to open %s.", pattern);
- } else if (pattern[0] == '/') {
- fp = fopen(pattern, "r");
- isTMP = TRUE;
- matchstream = -1;
- if (fp == NULL)
- errx(2, "Unable to open %s.", pattern);
- } else if (strcmp(pattern, "-") == 0) {
- fp = stdin;
- matchstream = -1;
- } else {
+ if(trial_index == UNDEF)
ret = pattern_match(MATCH_GLOB, pattern, pkgname);
- }
+ else {
- if (fp != NULL) {
size_t len;
+
+ char ln[4*FILENAME_MAX+1];
char *line;
- while ((line = fgetln(fp, &len)) != NULL) {
- int match;
- char *ch, ln[2048];
- size_t lnlen;
- if (len > 0 && line[len-1] == '\n')
- len --;
- lnlen = len;
- if (lnlen > sizeof(ln)-1)
- lnlen = sizeof(ln)-1;
- memcpy(ln, line, lnlen);
- ln[lnlen] = '\0';
- if ((ch = strchr(ln, '|')) != NULL)
- ch[0] = '\0';
- if (matchstream > 0)
- match = pattern_match(MATCH_GLOB, pattern, ln);
- else
- match = pattern_match(MATCH_GLOB, ln, pkgname);
- if (match == 1) {
- ret = 1;
- printf("%.*s\n", (int)len, line);
+
+ /** matchstream's not a real file; have to read line by line **/
+ if(matchstream != LOCALFILE) {
+
+ while ( (line = fgetln(fp, &len)) != NULL )
+ ret = version_match_service(ln, line, len, trial_strings[trial_index], (Boolean) matchstream);
+
+ if (matchstream != STDIN)
+ fclose(fp);
+
+ }
+ /** matchstream's a real file; can completely buffer the file into memory **/
+ else {
+
+ char *lines = fileGetContentsByDescriptor(fp, pkgname);
+
+ fclose(fp);
+
+ for( line = strtok(lines, "\n"); line != NULL; line = strtok(NULL, "\n") ) {
+ len = sizeof(line);
+ ret = version_match_service(ln, line, len, trial_strings[trial_index], (Boolean) matchstream);
}
+
}
- if (isTMP)
- fclose(fp);
+
}
return ret;
+
+}
+
+int
+version_match_service(char *dest, const char *src, size_t src_len, const char *trial_string, Boolean is_package)
+{
+
+ int match;
+ char *ch;
+
+ size_t dest_len = src_len;
+
+ if(dest_len != 0 && src[dest_len-1] == '\n')
+ dest_len--;
+
+ if(dest_len > sizeof(src)-1)
+ dest_len = sizeof(src)-1;
+
+ memcpy(dest, src, dest_len);
+
+ *(dest+dest_len) = '\0';
+
+ if((ch = strchr(dest, '|')) != NULL)
+ ch[0] = '\0';
+
+ if(is_package)
+ match = pattern_match(MATCH_GLOB, (const char*) trial_string, dest);
+ else
+ match = pattern_match(MATCH_GLOB, dest, trial_string);
+
+ if(match == 1) {
+ printf("%.*s\n", (int)src_len, src);
+ return 1;
+ }
+
+ return 0;
+
}
void
==== //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/version/version.h#2 (text+ko) ====
@@ -45,6 +45,7 @@
extern Boolean UseINDEXOnly;
extern Boolean ShowOrigin;
-extern int version_match(char *, const char *);
+extern int version_match(const char *, const char *);
+extern int version_match_service(char *, const char *, size_t, const char *, Boolean);
#endif /* _INST_VERSION_H_INCLUDE */
More information about the p4-projects
mailing list