[ Thread Index |
Date Index
| More lists.liballeg.org/allegro-developers Archives
]
Eric Botcazou wrote:
Nice! Could you post a patch (GNU diff) against the base dat.c you used?
umm.... is that what you want?
--- dat.c Sun Nov 09 19:43:12 2003
+++ dat2.c Mon Feb 23 17:38:05 2004
@@ -44,6 +44,7 @@
static int opt_relf = FALSE;
static int opt_verbose = FALSE;
static int opt_keepnames = FALSE;
+static int opt_recurse = FALSE;
static int opt_colordepth = -1;
static int opt_gridx = -1;
static int opt_gridy = -1;
@@ -111,6 +112,7 @@
printf("\t'-v' selects verbose mode\n");
printf("\t'-w' always updates the entire contents of the datafile\n");
printf("\t'-007 password' sets the file encryption key\n");
+ printf("\t'-+' recursively add folders as if they are datafiles\n");
printf("\t'PROP=value' sets object properties\n");
}
@@ -391,8 +393,57 @@
}
}
}
+typedef struct {DATAFILE *parent; DATAFILE *dat;} dataarg_t;
+dataarg_t* make_folder(dataarg_t *param,char *prop_value_string)
+{
+ DATAFILE *v=NULL;
+ long size = 0;
+ DATAFILE *parent=param->parent;
+ DATAFILE *dat=param->dat;
+ DATAFILE *d;
+ int replace=0;
+ int c;
+ dataarg_t *tmp=malloc(sizeof(dataarg_t));
+
+ for (c=0; dat[c].type != DAT_END; c++) { // check it already exists and it is a datafile
+ if (dat[c].type==DAT_FILE&&stricmp(prop_value_string, get_datafile_property(dat+c, DAT_NAME)) == 0) {
+ tmp->parent=tmp->dat;
+ tmp->dat= (DATAFILE *)dat[c].dat;
+ return tmp;
+ }
+ }
+
+ v = malloc(sizeof(DATAFILE));
+
+ v->dat = NULL;
+ v->type = DAT_END;
+ v->size = 0;
+ v->prop = NULL;
+
+ tmp->dat= v;
+ d=datedit_insert(dat, NULL, prop_value_string, DAT_FILE, v, size);
+ tmp->parent=d;
+ param->dat=d;
+
+ changed=1;
+
+ if(dat==datafile) {
+ datafile = d;
+ }
+ else {
+ for (c=0; parent[c].type != DAT_END; c++) {
+ if(parent[c].type==DAT_FILE&&((DATAFILE *)parent[c].dat)==dat) {
+ parent[c].dat=d;
+ return tmp;
+ }
+ }
+ return NULL;
+ }
+
+ return tmp;
+}
/* adds a file to the archive */
static int do_add_file(AL_CONST char *filename, int attrib, void *param)
@@ -400,13 +451,20 @@
char fname[256];
char name[256];
int c;
+ DATAFILE *parent=((dataarg_t*)param)->parent;
+ DATAFILE *dat=((dataarg_t*)param)->dat;
DATAFILE *d;
- DATEDIT_GRAB_PARAMETERS params;
+ DATEDIT_GRAB_PARAMETERS params;
+ dataarg_t *da;
+
canonicalize_filename(fname, filename, sizeof(fname));
-
strcpy(name, get_filename(fname));
+
+ if(strcmp(name,".")==0||strcmp(name,"..")==0)
+ return 0;
+
if (!opt_keepnames) {
strupr(name);
@@ -415,6 +473,30 @@
name[c] = '_';
}
+ if(opt_recurse&&(attrib&FA_DIREC)) { // hunt with in it...
+
+ printf("Inserting %s -> %s\n", fname, name);
+
+ da=make_folder(param,name);
+
+ if(!da) {
+ fprintf(stderr, "Error: failed to create sub datafile %s.\n",name);
+ err=1;
+ return 1;
+ }
+
+ append_filename(fname, fname, "*", sizeof(fname));
+
+ if (for_each_file_ex(fname, 0, 0, do_add_file, da) <= 0) {
+ fprintf(stderr, "Error: %s not found\n", fname);
+ free(da);
+ err=1;
+ return 1;
+ }
+ free(da);
+ return 0;
+ }
+
params.datafile = canonical_datafilename;
params.filename = fname;
params.name = name;
@@ -426,10 +508,10 @@
params.colordepth = opt_colordepth;
params.relative = opt_relf;
- for (c=0; datafile[c].type != DAT_END; c++) {
- if (stricmp(name, get_datafile_property(datafile+c, DAT_NAME)) == 0) {
+ for (c=0; dat[c].type != DAT_END; c++) {
+ if (stricmp(name, get_datafile_property(dat+c, DAT_NAME)) == 0) {
printf("Replacing %s -> %s\n", fname, name);
- if (!datedit_grabreplace(datafile+c, ¶ms)) {
+ if (!datedit_grabreplace(dat+c, ¶ms)) {
err = 1;
return -1;
}
@@ -441,13 +523,27 @@
}
printf("Inserting %s -> %s\n", fname, name);
- d = datedit_grabnew(datafile, ¶ms);
+ d = datedit_grabnew(dat, ¶ms);
+
if (!d) {
err = 1;
return -1;
}
else {
- datafile = d;
+ if(dat==datafile) {
+ datafile = d;
+
+ }
+ else {
+ for (c=0; parent[c].type != DAT_END; c++) {
+ if(((DATAFILE *)parent[c].dat)==dat) {
+ parent[c].dat=d;
+ return 0;
+ }
+ }
+ return 1;
+ }
+
changed = TRUE;
return 0;
}
@@ -693,6 +789,10 @@
switch (utolower(argv[c][1])) {
+ case '+':
+ opt_recurse = TRUE;
+ break;
+
case 'd':
if (stricmp(argv[c]+2, "ither") == 0) {
colorconv_mode |= COLORCONV_DITHER;
@@ -922,14 +1022,19 @@
err = 1;
}
else {
- for (c=0; c<opt_numnames; c++) {
- if (for_each_file_ex(opt_namelist[c], 0, ~(FA_ARCH | FA_RDONLY), do_add_file, NULL) <= 0) {
+ for (c=0; c<opt_numnames; c++) {
+ dataarg_t *tmp=malloc(sizeof(dataarg_t));
+ tmp->parent=NULL;
+ tmp->dat=datafile;
+ if (for_each_file_ex(opt_namelist[c], 0, (opt_recurse)?(~(FA_ARCH|FA_DIREC|FA_RDONLY)) :(~(FA_ARCH|FA_RDONLY)) , do_add_file, (void *)tmp) <= 0) {
fprintf(stderr, "Error: %s not found\n", opt_namelist[c]);
err = 1;
+ free(tmp);
break;
}
else
opt_usedname[c] = TRUE;
+ free(tmp);
}
}
break;