Scripting: Add -f flag to find for returning first match

This commit is contained in:
d0k3 2017-09-06 02:01:42 +02:00
parent 5f0ab648aa
commit 6d276c6bf5
4 changed files with 15 additions and 6 deletions

View File

@ -107,7 +107,8 @@ mv -w -k $[TESTPATH] $[RENPATH]
# Here we use it to check for RENPATH, thus we use NULL as second argument (we're not interested in the output) # Here we use it to check for RENPATH, thus we use NULL as second argument (we're not interested in the output)
find $[RENPATH] NULL find $[RENPATH] NULL
# Wildcards ('*' / '?') are allowed when searching for a file / directory name # Wildcards ('*' / '?') are allowed when searching for a file / directory name
# If wildcards are used, 'find' will always return the last alphanumerical match # If wildcards are used, 'find' will return the last alphanumerical match
# -f / --first return the first alphanumerical match instead
find S:/nand.* NANDIMAGE find S:/nand.* NANDIMAGE
# 'sha' COMMAND # 'sha' COMMAND

View File

@ -308,7 +308,7 @@ FRESULT fvx_preaddir (DIR* dp, FILINFO* fno, const TCHAR* pattern) {
return res; return res;
} }
FRESULT fvx_findpath (TCHAR* path, const TCHAR* pattern) { FRESULT fvx_findpath (TCHAR* path, const TCHAR* pattern, BYTE mode) {
strncpy(path, pattern, _MAX_FN_LEN); strncpy(path, pattern, _MAX_FN_LEN);
TCHAR* fname = strrchr(path, '/'); TCHAR* fname = strrchr(path, '/');
if (!fname) return FR_DENIED; if (!fname) return FR_DENIED;
@ -327,8 +327,10 @@ FRESULT fvx_findpath (TCHAR* path, const TCHAR* pattern) {
*fname = '\0'; *fname = '\0';
while ((fvx_preaddir(&pdir, &fno, npattern) == FR_OK) && *(fno.fname)) { while ((fvx_preaddir(&pdir, &fno, npattern) == FR_OK) && *(fno.fname)) {
if (strncmp(fno.fname, fname, _MAX_FN_LEN) > 0) int cmp = strncmp(fno.fname, fname, _MAX_FN_LEN);
if (((mode & FN_HIGHEST) && (cmp > 0)) || ((mode & FN_LOWEST) && (cmp < 0)) || !(*fname))
strncpy(fname, fno.fname, _MAX_FN_LEN - (fname - path)); strncpy(fname, fno.fname, _MAX_FN_LEN - (fname - path));
if (!(mode & (FN_HIGHEST|FN_LOWEST))) break;
} }
fvx_closedir( &pdir ); fvx_closedir( &pdir );

View File

@ -8,6 +8,10 @@
#define fvx_tell(fp) ((fp)->fptr) #define fvx_tell(fp) ((fp)->fptr)
#define fvx_size(fp) ((fp)->obj.objsize) #define fvx_size(fp) ((fp)->obj.objsize)
#define FN_ANY 0x00
#define FN_HIGHEST 0x01
#define FN_LOWEST 0x02
// wrapper functions for ff.h + sddata.h // wrapper functions for ff.h + sddata.h
// incomplete(!) extension to FatFS to support a common interface for virtual and FAT // incomplete(!) extension to FatFS to support a common interface for virtual and FAT
FRESULT fvx_open (FIL* fp, const TCHAR* path, BYTE mode); FRESULT fvx_open (FIL* fp, const TCHAR* path, BYTE mode);
@ -36,5 +40,5 @@ FRESULT fvx_runlink (const TCHAR* path);
// additional wildcard based functions // additional wildcard based functions
FRESULT fvx_match_name(const TCHAR* path, const TCHAR* pattern); FRESULT fvx_match_name(const TCHAR* path, const TCHAR* pattern);
FRESULT fvx_preaddir (DIR* dp, FILINFO* fno, const TCHAR* pattern); FRESULT fvx_preaddir (DIR* dp, FILINFO* fno, const TCHAR* pattern);
FRESULT fvx_findpath (TCHAR* path, const TCHAR* pattern); FRESULT fvx_findpath (TCHAR* path, const TCHAR* pattern, BYTE mode);
FRESULT fvx_findnopath (TCHAR* path, const TCHAR* pattern); FRESULT fvx_findnopath (TCHAR* path, const TCHAR* pattern);

View File

@ -100,7 +100,7 @@ Gm9ScriptCmd cmd_list[] = {
{ CMD_ID_MKDIR , "mkdir" , 1, 0 }, { CMD_ID_MKDIR , "mkdir" , 1, 0 },
{ CMD_ID_MOUNT , "imgmount", 1, 0 }, { CMD_ID_MOUNT , "imgmount", 1, 0 },
{ CMD_ID_UMOUNT , "imgumount",0, 0 }, { CMD_ID_UMOUNT , "imgumount",0, 0 },
{ CMD_ID_FIND , "find" , 2, 0 }, { CMD_ID_FIND , "find" , 2, _FLG('f') },
{ CMD_ID_FINDNOT , "findnot" , 2, 0 }, { CMD_ID_FINDNOT , "findnot" , 2, 0 },
{ CMD_ID_SHA , "sha" , 2, 0 }, { CMD_ID_SHA , "sha" , 2, 0 },
{ CMD_ID_SHAGET , "shaget" , 2, 0 }, { CMD_ID_SHAGET , "shaget" , 2, 0 },
@ -369,6 +369,7 @@ u32 get_flag(char* str, u32 len, char* err_str) {
if ((len < 2) || (*str != '-')) flag_char = '\0'; if ((len < 2) || (*str != '-')) flag_char = '\0';
else if (len == 2) flag_char = str[1]; else if (len == 2) flag_char = str[1];
else if (strncmp(str, "--all", len) == 0) flag_char = 'a'; else if (strncmp(str, "--all", len) == 0) flag_char = 'a';
else if (strncmp(str, "--first", len) == 0) flag_char = 'f';
else if (strncmp(str, "--hash", len) == 0) flag_char = 'h'; else if (strncmp(str, "--hash", len) == 0) flag_char = 'h';
else if (strncmp(str, "--skip", len) == 0) flag_char = 'k'; else if (strncmp(str, "--skip", len) == 0) flag_char = 'k';
else if (strncmp(str, "--legit", len) == 0) flag_char = 'l'; else if (strncmp(str, "--legit", len) == 0) flag_char = 'l';
@ -533,7 +534,8 @@ bool run_cmd(cmd_id id, u32 flags, char** argv, char* err_str) {
InitImgFS(NULL); InitImgFS(NULL);
} else if (id == CMD_ID_FIND) { } else if (id == CMD_ID_FIND) {
char path[_VAR_CNT_LEN]; char path[_VAR_CNT_LEN];
ret = (fvx_findpath(path, argv[0]) == FR_OK); u8 mode = (flags & _FLG('f')) ? FN_LOWEST : FN_HIGHEST;
ret = (fvx_findpath(path, argv[0], mode) == FR_OK);
if (err_str) snprintf(err_str, _ERR_STR_LEN, "find fail"); if (err_str) snprintf(err_str, _ERR_STR_LEN, "find fail");
if (ret) { if (ret) {
ret = set_var(argv[1], path); ret = set_var(argv[1], path);