diff options
Diffstat (limited to 'list.c')
| -rw-r--r-- | list.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/list.c b/list.c new file mode 100644 index 0000000..d95945e --- /dev/null +++ b/list.c @@ -0,0 +1,86 @@ +/* $OpenBSD: list.c,v 1.9 2019/05/16 12:44:18 florian Exp $ */ + +/* + * Copyright (c) 2008 Martynas Venckus <martynas@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SMALL + +#include <string.h> + +void parse_list(char **, char *); + +static void +parse_unix(char **line, char *type) +{ + char *tok; + int field = 0; + + while ((tok = strsep(line, " \t")) != NULL) { + if (*tok == '\0') + continue; + + if (field == 0) + *type = *tok; + + if (field == 7) { + if (line == NULL || *line == NULL) + break; + while (**line == ' ' || **line == '\t') + (*line)++; + break; + } + + field++; + } +} + +static void +parse_windows(char **line, char *type) +{ + char *tok; + int field = 0; + + *type = '-'; + while ((tok = strsep(line, " \t")) != NULL) { + if (*tok == '\0') + continue; + + if (field == 2 && strcmp(tok, "<DIR>") == 0) + *type = 'd'; + + if (field == 2) { + if (line == NULL || *line == NULL) + break; + while (**line == ' ' || **line == '\t') + (*line)++; + break; + } + + field++; + } +} + +void +parse_list(char **line, char *type) +{ + if (**line >= '0' && **line <= '9') + parse_windows(line, type); + else + parse_unix(line, type); +} + +#endif /* !SMALL */ + |