source: lib/libvcl/vcc_backend_util.c @ 8aa1d8

Revision 8aa1d8, 3.5 KB checked in by Poul-Henning Kamp <phk@…>, 3 years ago (diff)

Eliminate nested <*.h> includes from include/*

Sort #includes according to rules which are for me to know and you
to guess.

  • Property mode set to 100644
Line 
1/*-
2 * Copyright (c) 2006 Verdens Gang AS
3 * Copyright (c) 2006-2011 Varnish Software AS
4 * All rights reserved.
5 *
6 * Author: Poul-Henning Kamp <phk@phk.freebsd.dk>
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 */
30
31#include "config.h"
32
33#include <stdarg.h>
34#include <stdio.h>
35#include <string.h>
36
37#include "vcc_compile.h"
38
39/*--------------------------------------------------------------------
40 * Helper functions to complain about duplicate and missing fields
41 *
42 * XXX: idea: add groups to check for exclusivity, such that
43 * XXX:    ("!foo", "?bar", "!{", "this", "that", "}", NULL)
44 * XXX: means exactly one of "this" or "that", and
45 * XXX:    ("!foo", "?bar", "?{", "this", "that", "}", NULL)
46 * XXX: means at most one of "this" or "that".
47 */
48
49struct fld_spec {
50        const char      *name;
51        struct token    *found;
52};
53
54void
55vcc_ResetFldSpec(struct fld_spec *f)
56{
57
58        for (; f->name != NULL; f++)
59                f->found = NULL;
60}
61
62struct fld_spec *
63vcc_FldSpec(struct vcc *tl, const char *first, ...)
64{
65        struct fld_spec f[100], *r;
66        int n = 0;
67        va_list ap;
68        const char *p;
69
70        f[n++].name = first;
71        va_start(ap, first);
72        while (1) {
73                p = va_arg(ap, const char *);
74                if (p == NULL)
75                        break;
76                f[n++].name = p;
77                assert(n < 100);
78        }
79        va_end(ap);
80        f[n++].name = NULL;
81
82        vcc_ResetFldSpec(f);
83
84        r = TlAlloc(tl, sizeof *r * n);
85        memcpy(r, f, n * sizeof *r);
86        return (r);
87}
88
89void
90vcc_IsField(struct vcc *tl, struct token **t, struct fld_spec *fs)
91{
92        struct token *t_field;
93
94        SkipToken(tl, '.');
95        ExpectErr(tl, ID);
96        t_field = tl->t;
97        *t = t_field;
98        vcc_NextToken(tl);
99        SkipToken(tl, '=');
100
101        for (; fs->name != NULL; fs++) {
102                if (!vcc_IdIs(t_field, fs->name + 1))
103                        continue;
104                if (fs->found == NULL) {
105                        fs->found = t_field;
106                        return;
107                }
108                VSB_printf(tl->sb, "Field ");
109                vcc_ErrToken(tl, t_field);
110                VSB_printf(tl->sb, " redefined at:\n");
111                vcc_ErrWhere(tl, t_field);
112                VSB_printf(tl->sb, "\nFirst defined at:\n");
113                vcc_ErrWhere(tl, fs->found);
114                return;
115        }
116        VSB_printf(tl->sb, "Unknown field: ");
117        vcc_ErrToken(tl, t_field);
118        VSB_printf(tl->sb, " at\n");
119        vcc_ErrWhere(tl, t_field);
120        return;
121}
122
123void
124vcc_FieldsOk(struct vcc *tl, const struct fld_spec *fs)
125{
126
127        for (; fs->name != NULL; fs++) {
128                if (*fs->name == '!' && fs->found == NULL) {
129                        VSB_printf(tl->sb,
130                            "Mandatory field '%s' missing.\n", fs->name + 1);
131                        tl->err = 1;
132                }
133        }
134}
Note: See TracBrowser for help on using the repository browser.