test: copy files in test_expect_equal_file instead of moving them
[notmuch] / xutil.c
1 /* xutil.c - Various wrapper functions to abort on error.
2  *
3  * Copyright © 2009 Carl Worth
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see http://www.gnu.org/licenses/ .
17  *
18  * Author: Carl Worth <cworth@cworth.org>
19  */
20
21 #include "notmuch-private.h"
22
23 #include <stdio.h>
24
25 void *
26 xcalloc (size_t nmemb, size_t size)
27 {
28     void *ret;
29
30     ret = calloc (nmemb, size);
31     if (ret == NULL) {
32         fprintf (stderr, "Out of memory.\n");
33         exit (1);
34     }
35
36     return ret;
37 }
38
39 void *
40 xmalloc (size_t size)
41 {
42     void *ret;
43
44     ret = malloc (size);
45     if (ret == NULL) {
46         fprintf (stderr, "Out of memory.\n");
47         exit (1);
48     }
49
50     return ret;
51 }
52
53 void *
54 xrealloc (void *ptr, size_t size)
55 {
56     void *ret;
57
58     ret = realloc (ptr, size);
59     if (ret == NULL) {
60         fprintf (stderr, "Out of memory.\n");
61         exit (1);
62     }
63
64     return ret;
65 }
66
67 char *
68 xstrdup (const char *s)
69 {
70     char *ret;
71
72     ret = strdup (s);
73     if (ret == NULL) {
74         fprintf (stderr, "Out of memory.\n");
75         exit (1);
76     }
77
78     return ret;
79 }
80
81 char *
82 xstrndup (const char *s, size_t n)
83 {
84     char *ret;
85
86     if (strlen (s) <= n)
87         n = strlen (s);
88
89     ret = malloc (n + 1);
90     if (ret == NULL) {
91         fprintf (stderr, "Out of memory.\n");
92         exit (1);
93     }
94     memcpy (ret, s, n);
95     ret[n] = '\0';
96
97     return ret;
98 }
99
100 void
101 xregcomp (regex_t *preg, const char *regex, int cflags)
102 {
103     int rerr;
104
105     rerr = regcomp (preg, regex, cflags);
106     if (rerr) {
107         size_t error_size = regerror (rerr, preg, NULL, 0);
108         char *error = xmalloc (error_size);
109
110         regerror (rerr, preg, error, error_size);
111         fprintf (stderr, "Internal error: compiling regex %s: %s\n",
112                  regex, error);
113         exit (1);
114     }
115 }
116
117 int
118 xregexec (const regex_t *preg, const char *string,
119           size_t nmatch, regmatch_t pmatch[], int eflags)
120 {
121     unsigned int i;
122     int rerr;
123
124     rerr = regexec (preg, string, nmatch, pmatch, eflags);
125     if (rerr)
126         return rerr;
127
128     for (i = 0; i < nmatch; i++) {
129         if (pmatch[i].rm_so == -1) {
130             fprintf (stderr, "Internal error: matching regex against %s:"
131                      "Sub-match %d not found\n",
132                      string, i);
133             exit (1);
134         }
135     }
136
137     return 0;
138 }