/**
 * @file op_mangle.c
 * Mangling of sample file names
 *
 * @remark Copyright 2002 OProfile authors
 * @remark Read the file COPYING
 *
 * @author John Levon
 * @author Philippe Elie
 */

#include "op_mangle.h"

#include <string.h>
#include <stdio.h>

#include "op_libiberty.h"

#include "op_sample_file.h"
#include "op_config.h"

static void append_image(char * dest, int flags, int anon, char const * name, char const * anon_name)
{
	if ((flags & MANGLE_KERNEL) && !strchr(name, '/')) {
		strcat(dest, "{kern}/");
	} else if (anon && anon_name) {
		strcat(dest, "{anon:");
		strcat(dest, anon_name);
		strcat(dest,"}/");
	} else {
		strcat(dest, "{root}/");
	}

	strcat(dest, name);
	strcat(dest, "/");
}

char * op_mangle_filename(struct mangle_values const * values)
{
	char * mangled;
	size_t len;
	int anon = values->flags & MANGLE_ANON;
	int cg_anon = values->flags & MANGLE_CG_ANON;
	/* if dep_name != image_name we need to invert them (and so revert them
	 * unconditionally because if they are equal it doesn't hurt to invert
	 * them), see P:3, FIXME: this is a bit weirds, we prolly need to
	 * reword pp_interface */
	char const * image_name = values->dep_name;
	char const * anon_name = values->anon_name;
	char const * dep_name = values->image_name;
	char const * cg_image_name = values->cg_image_name;

	len = strlen(op_samples_current_dir) + strlen(dep_name) + 1
		+ strlen(values->event_name) + 1 + strlen(image_name) + 1;

	// Just to silence Coverity, check cg_image_name and anon_name below for !=NULL.
	if (cg_image_name && (values->flags & MANGLE_CALLGRAPH))
		len += strlen(cg_image_name) + 1;

	if (anon_name && (anon || cg_anon))
		len += strlen(anon_name);

	/* provision for tgid, tid, unit_mask, cpu and some {root}, {dep},
	 * {kern}, {anon} and {cg} marker */
	/* FIXME: too ugly */
	len += 256;

	mangled = xmalloc(len);

	strcpy(mangled, op_samples_current_dir);
	append_image(mangled, values->flags, 0, image_name, anon_name);

	strcat(mangled, "{dep}" "/");
	append_image(mangled, values->flags, anon, dep_name, anon_name);

	if (cg_image_name && (values->flags & MANGLE_CALLGRAPH)) {
		strcat(mangled, "{cg}" "/");
		append_image(mangled, values->flags, cg_anon,
		             cg_image_name, anon_name);
	}

	strcat(mangled, values->event_name);
	sprintf(mangled + strlen(mangled), ".%d.%d.",
	        values->count, values->unit_mask);

	if (values->flags & MANGLE_TGID) {
		sprintf(mangled + strlen(mangled), "%d.", values->tgid);
	} else {
		sprintf(mangled + strlen(mangled), "%s.", "all");
	}

	if (values->flags & MANGLE_TID) {
		sprintf(mangled + strlen(mangled), "%d.", values->tid);
	} else {
		sprintf(mangled + strlen(mangled), "%s.", "all");
	}

	if (values->flags & MANGLE_CPU) {
		sprintf(mangled + strlen(mangled), "%d", values->cpu);
	} else {
		sprintf(mangled + strlen(mangled), "%s", "all");
	}

	return mangled;
}
