/ libpkg / pkg_object.c
pkg_object.c
  1  /*-
  2   * Copyright (c) 2014 Baptiste Daroussin <bapt@FreeBSD.org>
  3   * All rights reserved.
  4   * 
  5   * Redistribution and use in source and binary forms, with or without
  6   * modification, are permitted provided that the following conditions
  7   * are met:
  8   * 1. Redistributions of source code must retain the above copyright
  9   *    notice, this list of conditions and the following disclaimer
 10   *    in this position and unchanged.
 11   * 2. Redistributions in binary form must reproduce the above copyright
 12   *    notice, this list of conditions and the following disclaimer in the
 13   *    documentation and/or other materials provided with the distribution.
 14   * 
 15   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
 16   * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 17   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 18   * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
 19   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 20   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 21   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 22   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 23   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 24   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 25   */
 26  
 27  #include <assert.h>
 28  #include <ucl.h>
 29  #include "pkg.h"
 30  #include "private/pkg.h"
 31  
 32  char *
 33  pkg_object_dump(const pkg_object *o)
 34  {
 35  	if (o == NULL)
 36  		return xstrdup("");
 37  
 38  	return (ucl_object_emit(o, UCL_EMIT_CONFIG));
 39  }
 40  
 41  void
 42  pkg_object_free(pkg_object *o)
 43  {
 44  	ucl_object_unref(o);
 45  }
 46  
 47  const char *
 48  pkg_object_key(const pkg_object *o)
 49  {
 50  	if (o == NULL)
 51  		return (NULL);
 52  
 53  	return (ucl_object_key(o));
 54  }
 55  
 56  const pkg_object *
 57  pkg_object_iterate(const pkg_object *o, pkg_iter *it)
 58  {
 59  	if (o == NULL)
 60  		return (NULL);
 61  
 62  	return (ucl_iterate_object(o, it, true));
 63  }
 64  
 65  pkg_object_t
 66  pkg_object_type(const pkg_object *o)
 67  {
 68  
 69  	if (o == NULL)
 70  		return (PKG_NULL);
 71  
 72  	switch (o->type) {
 73  	case UCL_OBJECT:
 74  		return (PKG_OBJECT);
 75  	case UCL_BOOLEAN:
 76  		return (PKG_BOOL);
 77  	case UCL_STRING:
 78  		return (PKG_STRING);
 79  	case UCL_INT:
 80  		return (PKG_INT);
 81  	case UCL_ARRAY:
 82  		return (PKG_ARRAY);
 83  	default:
 84  		return (PKG_NULL);
 85  	};
 86  
 87  }
 88  
 89  bool
 90  pkg_object_bool(const pkg_object *o)
 91  {
 92  	if (o == NULL || o->type != UCL_BOOLEAN)
 93  		return (false);
 94  
 95  	return (ucl_object_toboolean(o));
 96  }
 97  
 98  const char *
 99  pkg_object_string(const pkg_object *o)
100  {
101  	const char *ret;
102  
103  	if (o == NULL)
104  		return (NULL);
105  
106  	ret = ucl_object_tostring_forced(o);
107  
108  	if (ret && *ret == '\0')
109  		return (NULL);
110  	return (ret);
111  }
112  
113  int64_t
114  pkg_object_int(const pkg_object *o)
115  {
116  	if (o == NULL || o->type != UCL_INT)
117  		return (0);
118  
119  	return (ucl_object_toint(o));
120  }