New -as mkisofs options --sort-weight-list and --sort-weight-patterns

This commit is contained in:
2013-05-28 17:58:01 +00:00
parent db040c6e42
commit c479eb0c0c
9 changed files with 248 additions and 46 deletions

View File

@ -3954,3 +3954,85 @@ int Xorriso_get_blessing(struct XorrisO *xorriso, IsoNode *node,
}
/* @param flag bit0= use file addresses as search patterns
*/
int Xorriso_apply_sort_file(struct XorrisO *xorriso, char *path, int flag)
{
int ret, linecount= 0, filec= 0, zero, i;
FILE *fp= NULL;
char *sret, *line= NULL, *spt, *tpt, *patterns[1], **filev= NULL;
char *sort_weight_args[4];
off_t mem= 0;
IsoImage *volume;
Xorriso_alloc_meM(line, char, SfileadrL);
ret= Xorriso_get_volume(xorriso, &volume, 0);
if(ret<=0)
goto ex;
ret= Xorriso_afile_fopen(xorriso, path, "rb", &fp, 2);
if(ret <= 0)
{ret= 0; goto ex;}
while(1) {
sret= Sfile_fgets_n(line, SfileadrL - 1, fp, 0);
if(sret == NULL) {
if(ferror(fp))
{ret= 0; goto ex;}
break;
}
linecount++;
/* Find first space or tab */
spt= strchr(line, ' ');
tpt= strchr(line, '\t');
if(spt == NULL || (tpt != NULL && tpt < spt))
spt= tpt;
if(spt == NULL) {
sprintf(xorriso->info_text,
"No space or tab character found in line %d of sort weight file ",
linecount);
Text_shellsafe(path, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
*spt= 0;
patterns[0]= spt + 1;
if(flag & 1) {
/* Obtain list of matching files */
ret= Xorriso_expand_pattern(xorriso, 1, patterns, 0,
&filec, &filev, &mem, 4);
if(ret <= 0)
{ret= 0; goto ex;}
} else {
filec= 1;
}
/* Apply weight to file or directory tree */
for(i= 0; i < filec; i++) {
zero= 0;
if(flag & 1) {
sort_weight_args[0]= filev[i];
} else {
sort_weight_args[0]= patterns[0];
}
sort_weight_args[1]= "-exec";
sort_weight_args[2]= "sort_weight";
sort_weight_args[3]= line;
ret= Xorriso_option_find(xorriso, 4, sort_weight_args, &zero, 2);
if(ret <= 0)
{ret= 0; goto ex;}
}
if(flag & 1)
Sfile_destroy_argv(&filec, &filev, 0);
}
ret= 1;
ex:
if(fp != NULL)
fclose(fp);
Xorriso_free_meM(line);
Sfile_destroy_argv(&filec, &filev, 0);
return(ret);
}