1*bfd817adSflorian /* $OpenBSD: list.c,v 1.9 2019/05/16 12:44:18 florian Exp $ */
2*bfd817adSflorian
3*bfd817adSflorian /*
4*bfd817adSflorian * Copyright (c) 2008 Martynas Venckus <martynas@openbsd.org>
5*bfd817adSflorian *
6*bfd817adSflorian * Permission to use, copy, modify, and distribute this software for any
7*bfd817adSflorian * purpose with or without fee is hereby granted, provided that the above
8*bfd817adSflorian * copyright notice and this permission notice appear in all copies.
9*bfd817adSflorian *
10*bfd817adSflorian * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11*bfd817adSflorian * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12*bfd817adSflorian * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13*bfd817adSflorian * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14*bfd817adSflorian * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15*bfd817adSflorian * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16*bfd817adSflorian * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*bfd817adSflorian */
18*bfd817adSflorian
19*bfd817adSflorian #ifndef SMALL
20*bfd817adSflorian
21*bfd817adSflorian #include <string.h>
22*bfd817adSflorian
23*bfd817adSflorian void parse_list(char **, char *);
24*bfd817adSflorian
25*bfd817adSflorian static void
parse_unix(char ** line,char * type)26*bfd817adSflorian parse_unix(char **line, char *type)
27*bfd817adSflorian {
28*bfd817adSflorian char *tok;
29*bfd817adSflorian int field = 0;
30*bfd817adSflorian
31*bfd817adSflorian while ((tok = strsep(line, " \t")) != NULL) {
32*bfd817adSflorian if (*tok == '\0')
33*bfd817adSflorian continue;
34*bfd817adSflorian
35*bfd817adSflorian if (field == 0)
36*bfd817adSflorian *type = *tok;
37*bfd817adSflorian
38*bfd817adSflorian if (field == 7) {
39*bfd817adSflorian if (line == NULL || *line == NULL)
40*bfd817adSflorian break;
41*bfd817adSflorian while (**line == ' ' || **line == '\t')
42*bfd817adSflorian (*line)++;
43*bfd817adSflorian break;
44*bfd817adSflorian }
45*bfd817adSflorian
46*bfd817adSflorian field++;
47*bfd817adSflorian }
48*bfd817adSflorian }
49*bfd817adSflorian
50*bfd817adSflorian static void
parse_windows(char ** line,char * type)51*bfd817adSflorian parse_windows(char **line, char *type)
52*bfd817adSflorian {
53*bfd817adSflorian char *tok;
54*bfd817adSflorian int field = 0;
55*bfd817adSflorian
56*bfd817adSflorian *type = '-';
57*bfd817adSflorian while ((tok = strsep(line, " \t")) != NULL) {
58*bfd817adSflorian if (*tok == '\0')
59*bfd817adSflorian continue;
60*bfd817adSflorian
61*bfd817adSflorian if (field == 2 && strcmp(tok, "<DIR>") == 0)
62*bfd817adSflorian *type = 'd';
63*bfd817adSflorian
64*bfd817adSflorian if (field == 2) {
65*bfd817adSflorian if (line == NULL || *line == NULL)
66*bfd817adSflorian break;
67*bfd817adSflorian while (**line == ' ' || **line == '\t')
68*bfd817adSflorian (*line)++;
69*bfd817adSflorian break;
70*bfd817adSflorian }
71*bfd817adSflorian
72*bfd817adSflorian field++;
73*bfd817adSflorian }
74*bfd817adSflorian }
75*bfd817adSflorian
76*bfd817adSflorian void
parse_list(char ** line,char * type)77*bfd817adSflorian parse_list(char **line, char *type)
78*bfd817adSflorian {
79*bfd817adSflorian if (**line >= '0' && **line <= '9')
80*bfd817adSflorian parse_windows(line, type);
81*bfd817adSflorian else
82*bfd817adSflorian parse_unix(line, type);
83*bfd817adSflorian }
84*bfd817adSflorian
85*bfd817adSflorian #endif /* !SMALL */
86*bfd817adSflorian
87