New -as mkisofs options --sort-weight-list and --sort-weight-patterns
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user