#include "postgres.h"
#include <string.h>

#include "utils/array.h"
#include "utils/builtins.h"	/* text_to_cstring */
#include "catalog/pg_type.h"
#include "utils/lsyscache.h"
#include "fmgr.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(arraypoc);

Datum arraypoc(PG_FUNCTION_ARGS) {
  ArrayType   *result;
  Datum       *result_data = NULL;
  int16        o_typlen;
  bool         o_typbyval;
  char         o_typalign;
  text        *t,
              *cpyt;
  uint32       c;
  int         i, t_len;

  t = (text *)PG_GETARG_TEXT_PP(0);
  c = (uint32)PG_GETARG_INT32(1);

  if(c>0) result_data = (Datum *)palloc(sizeof(Datum) * c);

  for(i=0; i<c; ++i) {
    t_len = VARSIZE_ANY_EXHDR(t);

    cpyt = (text *)palloc(VARHDRSZ + t_len + 1 + 16);
    SET_VARSIZE(cpyt, VARHDRSZ + t_len + 1 + 16);
    memcpy((void *)VARDATA(cpyt), (void *)VARDATA(t), t_len);
    memcpy((void *)VARDATA(cpyt) + t_len, ",", 1);
    snprintf((void *)VARDATA(cpyt) + t_len + 1, 16, "%d", i);

    result_data[i] = PointerGetDatum(cpyt);
  }

  if(result_data == NULL || c <= 0) {
    PG_RETURN_NULL();

  } else {
    get_typlenbyvalalign(TEXTOID, &o_typlen, &o_typbyval, &o_typalign);
    result = construct_array(result_data, c, TEXTOID, o_typlen, o_typbyval,
                             o_typalign);
    PG_RETURN_ARRAYTYPE_P(result);
  }
}
