summaryrefslogtreecommitdiff
path: root/genisoimage/match.c
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2012-12-31 05:04:42 +0400
committerIgor Pashev <pashev.igor@gmail.com>2012-12-31 05:04:42 +0400
commit71dc8760ff4de5f365330d1bc571d934deb54af9 (patch)
tree7346d42a282562a3937d82307012b5857d642ce6 /genisoimage/match.c
downloadcdrkit-upstream/1.1.11.tar.gz
Imported Upstream version 1.1.11upstream/1.1.11upstream
Diffstat (limited to 'genisoimage/match.c')
-rw-r--r--genisoimage/match.c290
1 files changed, 290 insertions, 0 deletions
diff --git a/genisoimage/match.c b/genisoimage/match.c
new file mode 100644
index 0000000..6762e89
--- /dev/null
+++ b/genisoimage/match.c
@@ -0,0 +1,290 @@
+/*
+ * This file has been modified for the cdrkit suite.
+ *
+ * The behaviour and appearence of the program code below can differ to a major
+ * extent from the version distributed by the original author(s).
+ *
+ * For details, see Changelog file distributed with the cdrkit package. If you
+ * received this file from another source then ask the distributing person for
+ * a log of modifications.
+ *
+ */
+
+/* @(#)match.c 1.18 04/05/23 joerg */
+/*
+ * 27-Mar-96: Jan-Piet Mens <jpm@mens.de>
+ * added 'match' option (-m) to specify regular expressions NOT to be included
+ * in the CD image.
+ *
+ * Re-written 13-Apr-2000 James Pearson
+ * now uses a generic set of routines
+ */
+
+#include <mconfig.h>
+#include <stdio.h>
+#include <stdxlib.h>
+#include <unixstd.h>
+#include <strdefs.h>
+#include <standard.h>
+#include <schily.h>
+#include <libport.h>
+#include "match.h"
+
+struct match {
+ struct match *next;
+ char *name;
+};
+
+typedef struct match match;
+
+static match *mats[MAX_MAT];
+
+static char *mesg[MAX_MAT] = {
+ "excluded",
+ "excluded ISO-9660",
+ "excluded Joliet",
+ "hidden attribute ISO-9660",
+#ifdef APPLE_HYB
+ "excluded HFS",
+#endif /* APPLE_HYB */
+};
+
+#ifdef SORTING
+struct sort_match {
+ struct sort_match *next;
+ char *name;
+ int val;
+};
+
+typedef struct sort_match sort_match;
+
+static sort_match *s_mats;
+
+int
+add_sort_match(char *fn, int val)
+{
+ sort_match *s_mat;
+
+ s_mat = (sort_match *)malloc(sizeof (sort_match));
+ if (s_mat == NULL) {
+#ifdef USE_LIBSCHILY
+ errmsg("Can't allocate memory for sort filename\n");
+#else
+ fprintf(stderr, "Can't allocate memory for sort filename\n");
+#endif
+ return (0);
+ }
+
+ if ((s_mat->name = strdup(fn)) == NULL) {
+#ifdef USE_LIBSCHILY
+ errmsg("Can't allocate memory for sort filename\n");
+#else
+ fprintf(stderr, "Can't allocate memory for sort filename\n");
+#endif
+ return (0);
+ }
+
+ /* need to reserve the minimum value for other uses */
+ if (val == NOT_SORTED)
+ val++;
+
+ s_mat->val = val;
+ s_mat->next = s_mats;
+ s_mats = s_mat;
+
+ return (1);
+}
+
+void
+add_sort_list(char *file)
+{
+ FILE *fp;
+ char name[4096];
+ char *p;
+ int val;
+
+ if ((fp = fopen(file, "r")) == NULL) {
+#ifdef USE_LIBSCHILY
+ comerr("Can't open sort file list %s\n", file);
+#else
+ fprintf(stderr, "Can't open hidden/exclude file list %s\n", file);
+ exit(1);
+#endif
+ }
+
+ while (fgets(name, sizeof (name), fp) != NULL) {
+ /*
+ * look for the last space or tab character
+ */
+ if ((p = strrchr(name, ' ')) == NULL)
+ p = strrchr(name, '\t');
+ else if (strrchr(p, '\t') != NULL) /* Tab after space? */
+ p = strrchr(p, '\t');
+
+ if (p == NULL) {
+#ifdef USE_LIBSCHILY
+ comerrno(EX_BAD, "Incorrect sort file format\n\t%s", name);
+#else
+ fprintf(stderr, "Incorrect sort file format\n\t%s", name);
+#endif
+ continue;
+ } else {
+ *p = '\0';
+ val = atoi(++p);
+ }
+ if (!add_sort_match(name, val)) {
+ fclose(fp);
+ return;
+ }
+ }
+
+ fclose(fp);
+}
+
+int
+sort_matches(char *fn, int val)
+{
+ register sort_match *s_mat;
+
+ for (s_mat = s_mats; s_mat; s_mat = s_mat->next) {
+ if (fnmatch(s_mat->name, fn, FNM_FILE_NAME) != FNM_NOMATCH) {
+ return (s_mat->val); /* found sort value */
+ }
+ }
+ return (val); /* not found - default sort value */
+}
+
+void
+del_sort()
+{
+ register sort_match * s_mat, *s_mat1;
+
+ s_mat = s_mats;
+ while (s_mat) {
+ s_mat1 = s_mat->next;
+
+ free(s_mat->name);
+ free(s_mat);
+
+ s_mat = s_mat1;
+ }
+
+ s_mats = 0;
+}
+
+#endif /* SORTING */
+
+
+int
+gen_add_match(char *fn, int n)
+{
+ match *mat;
+
+ if (n >= MAX_MAT)
+ return (0);
+
+ mat = (match *)malloc(sizeof (match));
+ if (mat == NULL) {
+#ifdef USE_LIBSCHILY
+ errmsg("Can't allocate memory for %s filename\n", mesg[n]);
+#else
+ fprintf(stderr, "Can't allocate memory for %s filename\n", mesg[n]);
+#endif
+ return (0);
+ }
+
+ if ((mat->name = strdup(fn)) == NULL) {
+#ifdef USE_LIBSCHILY
+ errmsg("Can't allocate memory for %s filename\n", mesg[n]);
+#else
+ fprintf(stderr, "Can't allocate memory for %s filename\n", mesg[n]);
+#endif
+ return (0);
+ }
+
+ mat->next = mats[n];
+ mats[n] = mat;
+
+ return (1);
+}
+
+void
+gen_add_list(char *file, int n)
+{
+ FILE *fp;
+ char name[4096];
+ int len;
+
+ if ((fp = fopen(file, "r")) == NULL) {
+#ifdef USE_LIBSCHILY
+ comerr("Can't open %s file list %s\n", mesg[n], file);
+#else
+ fprintf(stderr, "Can't open %s file list %s\n", mesg[n], file);
+ exit(1);
+#endif
+ }
+
+ while (fgets(name, sizeof (name), fp) != NULL) {
+ /*
+ * strip of '\n'
+ */
+ len = strlen(name);
+ if (name[len - 1] == '\n') {
+ name[len - 1] = '\0';
+ }
+ if (!gen_add_match(name, n)) {
+ fclose(fp);
+ return;
+ }
+ }
+
+ fclose(fp);
+}
+
+int
+gen_matches(char *fn, int n)
+{
+ register match * mat;
+
+ if (n >= MAX_MAT)
+ return (0);
+
+ for (mat = mats[n]; mat; mat = mat->next) {
+ if (fnmatch(mat->name, fn, FNM_FILE_NAME) != FNM_NOMATCH) {
+ return (1); /* found -> excluded filename */
+ }
+ }
+ return (0); /* not found -> not excluded */
+}
+
+int
+gen_ishidden(int n)
+{
+ if (n >= MAX_MAT)
+ return (0);
+
+ return ((int)(mats[n] != 0));
+}
+
+void
+gen_del_match(int n)
+{
+ register match *mat;
+ register match *mat1;
+
+ if (n >= MAX_MAT)
+ return;
+
+ mat = mats[n];
+
+ while (mat) {
+ mat1 = mat->next;
+
+ free(mat->name);
+ free(mat);
+
+ mat = mat1;
+ }
+
+ mats[n] = 0;
+}