ftplistparser: split parse_unix into sub functions

Closes #17608
This commit is contained in:
Daniel Stenberg 2025-06-12 13:42:28 +02:00
parent 4a686ee6b0
commit 3b4e84c44f
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -396,18 +396,12 @@ static CURLcode unix_filetype(const char c, curlfiletype *t)
return CURLE_OK;
}
static CURLcode parse_unix(struct Curl_easy *data,
struct ftp_parselist_data *parser,
static CURLcode parse_unix_totalsize(struct ftp_parselist_data *parser,
struct fileinfo *infop,
const char c)
{
struct curl_fileinfo *finfo = &infop->info;
size_t len = curlx_dyn_len(&infop->buf);
char *mem = curlx_dyn_ptr(&infop->buf);
CURLcode result = CURLE_OK;
switch(parser->state.UNIX.main) {
case PL_UNIX_TOTALSIZE:
switch(parser->state.UNIX.sub.total_dirsize) {
case PL_UNIX_TOTALSIZE_INIT:
if(c == 't') {
@ -447,18 +441,14 @@ static CURLcode parse_unix(struct Curl_easy *data,
}
break;
}
if(parser->state.UNIX.main != PL_UNIX_FILETYPE)
break;
FALLTHROUGH();
case PL_UNIX_FILETYPE:
result = unix_filetype(c, &finfo->filetype);
if(result)
return result;
parser->state.UNIX.main = PL_UNIX_PERMISSION;
parser->item_length = 0;
parser->item_offset = 1;
break;
case PL_UNIX_PERMISSION:
return CURLE_OK;
}
static CURLcode parse_unix_permission(struct ftp_parselist_data *parser,
struct fileinfo *infop,
const char c)
{
char *mem = curlx_dyn_ptr(&infop->buf);
parser->item_length++;
if((parser->item_length <= 9) && !strchr("rwx-tTsS", c))
return CURLE_FTP_BAD_FILE_LIST;
@ -481,8 +471,16 @@ static CURLcode parse_unix(struct Curl_easy *data,
parser->state.UNIX.main = PL_UNIX_HLINKS;
parser->state.UNIX.sub.hlinks = PL_UNIX_HLINKS_PRESPACE;
}
break;
case PL_UNIX_HLINKS:
return CURLE_OK;
}
static CURLcode parse_unix_hlinks(struct ftp_parselist_data *parser,
struct fileinfo *infop,
const char c)
{
size_t len = curlx_dyn_len(&infop->buf);
char *mem = curlx_dyn_ptr(&infop->buf);
switch(parser->state.UNIX.sub.hlinks) {
case PL_UNIX_HLINKS_PRESPACE:
if(c != ' ') {
@ -516,8 +514,15 @@ static CURLcode parse_unix(struct Curl_easy *data,
break;
}
break;
case PL_UNIX_USER:
return CURLE_OK;
}
static CURLcode parse_unix_user(struct ftp_parselist_data *parser,
struct fileinfo *infop,
const char c)
{
size_t len = curlx_dyn_len(&infop->buf);
char *mem = curlx_dyn_ptr(&infop->buf);
switch(parser->state.UNIX.sub.user) {
case PL_UNIX_USER_PRESPACE:
if(c != ' ' && len) {
@ -538,8 +543,15 @@ static CURLcode parse_unix(struct Curl_easy *data,
}
break;
}
break;
case PL_UNIX_GROUP:
return CURLE_OK;
}
static CURLcode parse_unix_group(struct ftp_parselist_data *parser,
struct fileinfo *infop,
const char c)
{
size_t len = curlx_dyn_len(&infop->buf);
char *mem = curlx_dyn_ptr(&infop->buf);
switch(parser->state.UNIX.sub.group) {
case PL_UNIX_GROUP_PRESPACE:
if(c != ' ' && len) {
@ -560,8 +572,15 @@ static CURLcode parse_unix(struct Curl_easy *data,
}
break;
}
break;
case PL_UNIX_SIZE:
return CURLE_OK;
}
static CURLcode parse_unix_size(struct ftp_parselist_data *parser,
struct fileinfo *infop,
const char c)
{
size_t len = curlx_dyn_len(&infop->buf);
char *mem = curlx_dyn_ptr(&infop->buf);
switch(parser->state.UNIX.sub.size) {
case PL_UNIX_SIZE_PRESPACE:
if(c != ' ') {
@ -596,8 +615,17 @@ static CURLcode parse_unix(struct Curl_easy *data,
break;
}
break;
case PL_UNIX_TIME:
return CURLE_OK;
}
static CURLcode parse_unix_time(struct ftp_parselist_data *parser,
struct fileinfo *infop,
const char c)
{
size_t len = curlx_dyn_len(&infop->buf);
char *mem = curlx_dyn_ptr(&infop->buf);
struct curl_fileinfo *finfo = &infop->info;
switch(parser->state.UNIX.sub.time) {
case PL_UNIX_TIME_PREPART1:
if(c != ' ') {
@ -662,8 +690,18 @@ static CURLcode parse_unix(struct Curl_easy *data,
return CURLE_FTP_BAD_FILE_LIST;
break;
}
break;
case PL_UNIX_FILENAME:
return CURLE_OK;
}
static CURLcode parse_unix_filename(struct Curl_easy *data,
struct ftp_parselist_data *parser,
struct fileinfo *infop,
const char c)
{
size_t len = curlx_dyn_len(&infop->buf);
char *mem = curlx_dyn_ptr(&infop->buf);
CURLcode result = CURLE_OK;
switch(parser->state.UNIX.sub.filename) {
case PL_UNIX_FILENAME_PRESPACE:
if(c != ' ' && len) {
@ -682,8 +720,6 @@ static CURLcode parse_unix(struct Curl_easy *data,
parser->offsets.filename = parser->item_offset;
parser->state.UNIX.main = PL_UNIX_FILETYPE;
result = ftp_pl_insert_finfo(data, infop);
if(result)
return result;
}
break;
case PL_UNIX_FILENAME_WINDOWSEOL:
@ -692,16 +728,23 @@ static CURLcode parse_unix(struct Curl_easy *data,
parser->offsets.filename = parser->item_offset;
parser->state.UNIX.main = PL_UNIX_FILETYPE;
result = ftp_pl_insert_finfo(data, infop);
if(result)
return result;
}
else
return CURLE_FTP_BAD_FILE_LIST;
result = CURLE_FTP_BAD_FILE_LIST;
break;
}
break;
case PL_UNIX_SYMLINK:
return result;
}
static CURLcode parse_unix_symlink(struct Curl_easy *data,
struct ftp_parselist_data *parser,
struct fileinfo *infop,
const char c)
{
size_t len = curlx_dyn_len(&infop->buf);
char *mem = curlx_dyn_ptr(&infop->buf);
CURLcode result = CURLE_OK;
switch(parser->state.UNIX.sub.symlink) {
case PL_UNIX_SYMLINK_PRESPACE:
if(c != ' ' && len) {
@ -774,7 +817,7 @@ static CURLcode parse_unix(struct Curl_easy *data,
parser->offsets.symlink_target = parser->item_offset;
result = ftp_pl_insert_finfo(data, infop);
if(result)
return result;
break;
parser->state.UNIX.main = PL_UNIX_FILETYPE;
}
@ -785,18 +828,68 @@ static CURLcode parse_unix(struct Curl_easy *data,
parser->offsets.symlink_target = parser->item_offset;
result = ftp_pl_insert_finfo(data, infop);
if(result)
return result;
break;
parser->state.UNIX.main = PL_UNIX_FILETYPE;
}
else
return CURLE_FTP_BAD_FILE_LIST;
result = CURLE_FTP_BAD_FILE_LIST;
break;
}
return result;
}
static CURLcode parse_unix(struct Curl_easy *data,
struct ftp_parselist_data *parser,
struct fileinfo *infop,
const char c)
{
struct curl_fileinfo *finfo = &infop->info;
CURLcode result = CURLE_OK;
switch(parser->state.UNIX.main) {
case PL_UNIX_TOTALSIZE:
result = parse_unix_totalsize(parser, infop, c);
if(result)
break;
if(parser->state.UNIX.main != PL_UNIX_FILETYPE)
break;
FALLTHROUGH();
case PL_UNIX_FILETYPE:
result = unix_filetype(c, &finfo->filetype);
if(!result) {
parser->state.UNIX.main = PL_UNIX_PERMISSION;
parser->item_length = 0;
parser->item_offset = 1;
}
break;
case PL_UNIX_PERMISSION:
result = parse_unix_permission(parser, infop, c);
break;
case PL_UNIX_HLINKS:
result = parse_unix_hlinks(parser, infop, c);
break;
case PL_UNIX_USER:
result = parse_unix_user(parser, infop, c);
break;
case PL_UNIX_GROUP:
result = parse_unix_group(parser, infop, c);
break;
case PL_UNIX_SIZE:
result = parse_unix_size(parser, infop, c);
break;
case PL_UNIX_TIME:
result = parse_unix_time(parser, infop, c);
break;
case PL_UNIX_FILENAME:
result = parse_unix_filename(data, parser, infop, c);
break;
case PL_UNIX_SYMLINK:
result = parse_unix_symlink(data, parser, infop, c);
break;
}
return CURLE_OK;
return result;
}
static CURLcode parse_winnt(struct Curl_easy *data,