struct pat_ref *pat_ref_new(const char *reference, const char *display, unsigned int flags);
struct pat_ref *pat_ref_newid(int unique_id, const char *display, unsigned int flags);
struct pat_ref_elt *pat_ref_find_elt(struct pat_ref *ref, const char *key);
-int pat_ref_append(struct pat_ref *ref, char *pattern, char *sample, int line);
+struct pat_ref_elt *pat_ref_append(struct pat_ref *ref, const char *pattern, const char *sample, int line);
int pat_ref_add(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
int pat_ref_set(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
int pat_ref_set_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt, const char *value, char **err);
return ref;
}
-/* This function adds entry to <ref>. It can failed with memory error.
- * If the function fails, it returns 0.
+/* This function adds entry to <ref>. It can fail on memory error. It returns
+ * the newly added element on success, or NULL on failure. The PATREF_LOCK on
+ * <ref> must be held.
*/
-int pat_ref_append(struct pat_ref *ref, char *pattern, char *sample, int line)
+struct pat_ref_elt *pat_ref_append(struct pat_ref *ref, const char *pattern, const char *sample, int line)
{
struct pat_ref_elt *elt;
elt = malloc(sizeof(*elt));
if (!elt)
- return 0;
+ goto fail;
elt->line = line;
elt->pattern = strdup(pattern);
- if (!elt->pattern) {
- free(elt);
- return 0;
- }
+ if (!elt->pattern)
+ goto fail;
if (sample) {
elt->sample = strdup(sample);
- if (!elt->sample) {
- free(elt->pattern);
- free(elt);
- return 0;
- }
+ if (!elt->sample)
+ goto fail;
}
else
elt->sample = NULL;
LIST_INIT(&elt->back_refs);
LIST_ADDQ(&ref->head, &elt->list);
-
- return 1;
+ return elt;
+ fail:
+ if (elt)
+ free(elt->pattern);
+ free(elt);
+ return NULL;
}
/* This function create sample found in <elt>, parse the pattern also