int fill_quarter_args(char **args, struct measure_s *minfo, int myid,
			int soloist, int q_idx)
{
	int quarter_solo;
	char *qpos, *qinstr, *qchord_note, *qchorde_mode, *qdyna, *qmood,
		*qgenre, *qscale;
	char *qtags[N_TAGS];

	if (split_tags(minfo->tags.payload, qtags) == -1){
		fprintf(stderr, "%s\n", "Error in split_tags");
		return -1;
	}

	asprintf(&args[0], "%d", q_idx); //pos
	asprintf(&args[1], "%d", myid & 0xff); //instrument class
	asprintf(&args[2], "%d", minfo->chords[q_idx].note); //chord_note
	asprintf(&args[3], "%d", minfo->chords[q_idx].mode); //chord_mode mask
	asprintf(&args[4], "%s", qtags[1]); //tag_genre
	asprintf(&args[5], "%s", qtags[0]); //tag_dynamic
	asprintf(&args[6], "%s", qtags[2]); //tag_mood
	asprintf(&args[7], "%d", minfo->tonal_zones[q_idx].scale); //scale mask
	
	quarter_solo = 0;
	if (soloist == 1 && myid == minfo->soloist_id)
		quarter_solo = 1;
	
	asprintf(&args[8], "%d", quarter_solo);
	return 0;
}
int output_gazetteer_t::gazetteer_process_node(osmid_t id, double lat, double lon, struct keyval *tags, int delete_old)
{
   struct keyval names;
   struct keyval places;
   struct keyval extratags;
   struct keyval *place;
   int adminlevel;
   struct keyval * housenumber;
   struct keyval * street;
   struct keyval * addr_place;
   char * isin;
   struct keyval * postcode;
   struct keyval * countrycode;
   char wkt[128];


   /* Split the tags */
   split_tags(tags, TAGINFO_NODE, &names, &places, &extratags, &adminlevel, &housenumber, &street, &addr_place, &isin, &postcode, &countrycode);

   if (delete_old)
       delete_unused_classes('N', id, &places);

   /* Are we interested in this item? */
   if (keyval::listHasData(&places))
   {
      sprintf(wkt, "POINT(%.15g %.15g)", lon, lat);
      for (place = keyval::firstItem(&places); place; place = keyval::nextItem(&places, place))
      {
         add_place('N', id, place->key, place->value, &names, &extratags, adminlevel, housenumber, street, addr_place, isin, postcode, countrycode, wkt);
      }
   }

   if (housenumber) keyval::freeItem(housenumber);
   if (street) keyval::freeItem(street);
   if (addr_place) keyval::freeItem(addr_place);
   if (isin) free(isin);
   if (postcode) keyval::freeItem(postcode);
   if (countrycode) keyval::freeItem(countrycode);

   /* Free tag lists */
   keyval::resetList(&names);
   keyval::resetList(&places);
   keyval::resetList(&extratags);

   return 0;
}
int output_gazetteer_t::gazetteer_process_relation(osmid_t id, struct member *members, int member_count, struct keyval *tags, int delete_old)
{
   struct keyval names;
   struct keyval places;
   struct keyval extratags;
   struct keyval *place;
   int adminlevel;
   struct keyval * housenumber;
   struct keyval * street;
   struct keyval * addr_place;
   char * isin;
   struct keyval * postcode;
   struct keyval * countrycode;
   const char *type;
   int cmp_waterway;

   type = keyval::getItem(tags, "type");
   if (!type) {
      if (delete_old) delete_unused_classes('R', id, 0);
      return 0;
   }

   cmp_waterway = strcmp(type, "waterway");

   if (!strcmp(type, "associatedStreet"))
   {
      if (delete_old) delete_unused_classes('R', id, 0);
      return 0;
   }

   if (strcmp(type, "boundary") && strcmp(type, "multipolygon") && cmp_waterway) {
      if (delete_old) delete_unused_classes('R', id, 0);
      return 0;
   }

   /* Split the tags */
   split_tags(tags, TAGINFO_AREA, &names, &places, &extratags, &adminlevel, &housenumber, &street, &addr_place, &isin, &postcode, &countrycode);

   /* reset type to NULL because split_tags() consumes the tags
    * keyval and means that it's pointing to some random stuff
    * which might be harmful if dereferenced. */
   type = NULL;

   if (delete_old)
       delete_unused_classes('R', id, &places);

   if (keyval::listHasData(&places))
   {
      /* get the boundary path (ways) */
      int i, count;
      int *xcount = (int *)malloc( (member_count+1) * sizeof(int) );
      keyval *xtags  = new keyval[member_count+1];
      struct osmNode **xnodes = (struct osmNode **)malloc( (member_count+1) * sizeof(struct osmNode*) );
      osmid_t *xid2 = (osmid_t *)malloc( (member_count+1) * sizeof(osmid_t) );

      count = 0;
      for (i=0; i<member_count; i++)
      {
         /* only interested in ways */
         if (members[i].type != OSMTYPE_WAY)
            continue;
         xid2[count] = members[i].id;
         count++;
      }

      if (count == 0)
      {
          if (delete_old) delete_unused_classes('R', id, 0);
          free(xcount);
          delete [] xtags;
          free(xnodes);
          free(xid2);
          return 0;
      }

      osmid_t *xid = (osmid_t *)malloc( sizeof(osmid_t) * (count + 1));
      count = m_mid->ways_get_list(xid2, count, xid, xtags, xnodes, xcount);

      xnodes[count] = NULL;
      xcount[count] = 0;

      if (cmp_waterway)
      {
         geometry_builder::maybe_wkts_t wkts = builder.build_both(xnodes, xcount, 1, 1, 1000000, id);
         for (geometry_builder::wkt_itr wkt = wkts->begin(); wkt != wkts->end(); ++wkt)
         {
            if ((boost::starts_with(wkt->geom,  "POLYGON") || boost::starts_with(wkt->geom,  "MULTIPOLYGON")))
            {
                for (place = keyval::firstItem(&places); place; place = keyval::nextItem(&places, place))
                {
                   add_place('R', id, place->key, place->value, &names, &extratags, adminlevel, housenumber, street, addr_place,
                             isin, postcode, countrycode, wkt->geom.c_str());
                }
            }
            else
            {
                /* add_polygon_error('R', id, "boundary", "adminitrative", &names, countrycode, wkt); */
            }
         }
      } else {
         /* waterways result in multilinestrings */
         // wkt_t build_multilines(const osmNode * const * xnodes, const int *xcount, osmid_t osm_id) const;
         geometry_builder::maybe_wkt_t wkt = builder.build_multilines(xnodes, xcount, id);
         if ((wkt->geom).length() > 0)
         {
            for (place = keyval::firstItem(&places); place; place = keyval::nextItem(&places, place))
            {
               add_place('R', id, place->key, place->value, &names, &extratags, adminlevel, housenumber, street, addr_place,
                         isin, postcode, countrycode, wkt->geom.c_str());
            }
         }
      }
      for( i=0; i<count; i++ )
      {
         keyval::resetList( &(xtags[i]) );
         free( xnodes[i] );
      }

      free(xid);
      free(xid2);
      free(xcount);
      delete [] xtags;
      free(xnodes);
   }

   if (housenumber) keyval::freeItem(housenumber);
   if (street) keyval::freeItem(street);
   if (addr_place) keyval::freeItem(addr_place);
   if (isin) free(isin);
   if (postcode) keyval::freeItem(postcode);
   if (countrycode) keyval::freeItem(countrycode);

   /* Free tag lists */
   keyval::resetList(&names);
   keyval::resetList(&places);
   keyval::resetList(&extratags);

   return 0;
}
int output_gazetteer_t::gazetteer_process_way(osmid_t id, osmid_t *ndv, int ndc, struct keyval *tags, int delete_old)
{
   struct keyval names;
   struct keyval places;
   struct keyval extratags;
   struct keyval *place;
   int adminlevel;
   struct keyval * housenumber;
   struct keyval * street;
   struct keyval * addr_place;
   char * isin;
   struct keyval * postcode;
   struct keyval * countrycode;
   int area;


   /* Split the tags */
   area = split_tags(tags, TAGINFO_WAY, &names, &places, &extratags, &adminlevel, &housenumber, &street, &addr_place, &isin, &postcode, &countrycode);

   if (delete_old)
       delete_unused_classes('W', id, &places);

   /* Are we interested in this item? */
   if (keyval::listHasData(&places))
   {
      struct osmNode *nodev;
      int nodec;

      /* Fetch the node details */
      nodev = (struct osmNode *)malloc(ndc * sizeof(struct osmNode));
      nodec = m_mid->nodes_get_list(nodev, ndv, ndc);

      /* Get the geometry of the object */
      geometry_builder::maybe_wkt_t wkt = builder.get_wkt_simple(nodev, nodec, area);
      if (wkt)
      {
         for (place = keyval::firstItem(&places); place; place = keyval::nextItem(&places, place))
         {
            add_place('W', id, place->key, place->value, &names, &extratags, adminlevel,
                      housenumber, street, addr_place, isin, postcode, countrycode, wkt->geom.c_str());
         }
      }

      /* Free the nodes */
      free(nodev);
   }

   if (housenumber) keyval::freeItem(housenumber);
   if (street) keyval::freeItem(street);
   if (addr_place) keyval::freeItem(addr_place);
   if (isin) free(isin);
   if (postcode) keyval::freeItem(postcode);
   if (countrycode) keyval::freeItem(countrycode);

   /* Free tag lists */
   keyval::resetList(&names);
   keyval::resetList(&places);
   keyval::resetList(&extratags);

   return 0;
}