plist_ffi 0.1.1

C FFI for the amazing plist crate, compatible with libplist
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

#include "../plist.h"
#include <string.h>

void print_plist(plist_t pl) {
  char *xml = NULL;
  uint32_t xlen = 0;
  plist_to_xml(pl, &xml, &xlen);
  if (xml) {
    printf("%s\n", xml);
  }
  free(xml);
}

int main(int argc, char **argv) {
  int err = 0;
  char *xml = NULL;
  uint32_t xlen = 0;
  plist_t iii = plist_new_int(0);

  /* test 1 */
  plist_set_uint_val(iii, 0x8000000000000000LL);
  plist_to_xml(iii, &xml, &xlen);
  const char *match1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                       "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" "
                       "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
                       "<plist version=\"1.0\">\n"
                       "<integer>9223372036854775808</integer>\n"
                       "</plist>\n";
  if (strcmp(xml, match1) != 0) {
    printf("ERROR: plist_set_uint_val with 0x8000000000000000LL failed\n");
    err++;
  } else {
    printf("SUCCESS: plist_set_uint_val with 0x8000000000000000LL\n");
  }
  free(xml);
  xml = NULL;

  /* test 2 */
  plist_set_int_val(iii, 0x8000000000000000LL);
  plist_to_xml(iii, &xml, &xlen);
  const char *match2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                       "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" "
                       "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
                       "<plist version=\"1.0\">\n"
                       "<integer>-9223372036854775808</integer>\n"
                       "</plist>\n";
  if (strcmp(xml, match2) != 0) {
    printf("ERROR: plist_set_int_val with 0x8000000000000000LL failed\n");
    err++;
  } else {
    printf("SUCCESS: plist_set_int_val with 0x8000000000000000LL\n");
  }
  free(xml);
  xml = NULL;

  /* test 3 */
  plist_set_uint_val(iii, (uint64_t)-1LL);
  plist_to_xml(iii, &xml, &xlen);
  const char *match3 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                       "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" "
                       "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
                       "<plist version=\"1.0\">\n"
                       "<integer>18446744073709551615</integer>\n"
                       "</plist>\n";
  if (strcmp(xml, match3) != 0) {
    printf("ERROR: plist_set_uint_val with (uint64_t)-1LL failed\n");
    err++;
  } else {
    printf("SUCCESS: plist_set_uint_val with (uint64_t)-1LL\n");
  }
  free(xml);
  xml = NULL;

  /* test 4 */
  plist_set_int_val(iii, -1LL);
  plist_to_xml(iii, &xml, &xlen);
  const char *match4 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                       "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" "
                       "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
                       "<plist version=\"1.0\">\n"
                       "<integer>-1</integer>\n"
                       "</plist>\n";
  if (strcmp(xml, match4) != 0) {
    printf("ERROR: plist_set_int_val with -1LL failed\n");
    err++;
  } else {
    printf("SUCCESS: plist_set_int_val with -1LL\n");
  }
  free(xml);
  xml = NULL;

  /* test 5 */
  plist_set_uint_val(iii, 0x8000000000000001LL);
  plist_to_xml(iii, &xml, &xlen);
  const char *match5 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                       "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" "
                       "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
                       "<plist version=\"1.0\">\n"
                       "<integer>9223372036854775809</integer>\n"
                       "</plist>\n";
  if (strcmp(xml, match5) != 0) {
    printf("ERROR: plist_set_uint_val with 0x8000000000000001LL failed\n");
    err++;
  } else {
    printf("SUCCESS: plist_set_uint_val with 0x8000000000000001LL\n");
  }
  free(xml);
  xml = NULL;

  /* test 6 */
  plist_set_uint_val(iii, 18446744073709551615uLL);
  plist_to_xml(iii, &xml, &xlen);
  const char *match6 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                       "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" "
                       "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
                       "<plist version=\"1.0\">\n"
                       "<integer>18446744073709551615</integer>\n"
                       "</plist>\n";
  if (strcmp(xml, match6) != 0) {
    printf("ERROR: plist_set_uint_val with 0x8000000000000001LL failed\n");
    err++;
  } else {
    printf("SUCCESS: plist_set_uint_val with 0x8000000000000001LL\n");
  }
  free(xml);
  xml = NULL;

  return (err > 0) ? EXIT_FAILURE : EXIT_SUCCESS;
}