diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-01-03 12:23:44 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-01-03 12:23:52 +0200 |
commit | 80ed5e611de0e31eed65ee207f1fd64ad097e6d1 (patch) | |
tree | 40979fe5ecadaa3d1351c645ff7988a87218e142 /mimetypes/locus.c | |
parent | a4edd153e4cdf703c98008313743b112274e760f (diff) | |
download | fileserv-80ed5e611de0e31eed65ee207f1fd64ad097e6d1.tar.gz fileserv-80ed5e611de0e31eed65ee207f1fd64ad097e6d1.tar.bz2 |
Add mimetypes library.
Ported from GNU Mailutils.
Diffstat (limited to 'mimetypes/locus.c')
-rw-r--r-- | mimetypes/locus.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/mimetypes/locus.c b/mimetypes/locus.c new file mode 100644 index 0000000..e3eba86 --- /dev/null +++ b/mimetypes/locus.c @@ -0,0 +1,95 @@ +/* This file is part of fileserv. + Copyright (C) 2017, 2018 Sergey Poznyakoff + + Fileserv is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + Fileserv is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with fileserv. If not, see <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <errno.h> +#include "locus.h" + +int +locus_point_set_file (struct locus_point *pt, const char *filename) +{ + int rc; + char const *ref; + + rc = ident_ref (filename, &ref); + if (rc) + return rc; + ident_deref (pt->file); + pt->file = ref; + return 0; +} + +void +locus_point_init (struct locus_point *pt) +{ + memset (pt, 0, sizeof *pt); +} + +void +locus_point_deinit (struct locus_point *pt) +{ + ident_deref (pt->file); + memset (pt, 0, sizeof *pt); +} + +int +locus_point_copy (struct locus_point *dest, struct locus_point const *src) +{ + int rc = locus_point_set_file (dest, src->file); + if (rc == 0) + { + dest->col = src->col; + dest->line = src->line; + } + return rc; +} + +void +locus_range_init (struct locus_range *dest) +{ + memset (dest, 0, sizeof *dest); +} + +int +locus_range_copy (struct locus_range *dest, struct locus_range const *src) +{ + int rc; + struct locus_range tmp = LOCUS_RANGE_INITIALIZER; + + if (!dest) + return EINVAL; + + rc = locus_point_copy (&tmp.beg, &src->beg); + if (rc == 0) + { + rc = locus_point_copy (&tmp.end, &src->end); + if (rc) + locus_point_deinit (&tmp.beg); + else + { + locus_range_deinit (dest); + *dest = tmp; + } + } + return rc; +} + +void +locus_range_deinit (struct locus_range *lr) +{ + locus_point_deinit (&lr->beg); + locus_point_deinit (&lr->end); +} |