view utils.c @ 1076:b8d7683ec05a default tip

sidebar: use a logarithmic tagcloud scaling Instead of linearly scaling the tagcloud entries based on their counts, scale it based on the 2 times the natural log of the count. This gives more weight to lower count tags, making the whole cloud looking "denser". Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Fri, 28 Aug 2020 03:31:08 +0000
parents 5306db73b02f
children
line wrap: on
line source

/*
 * Copyright (c) 2011-2021 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

#include "utils.h"

#define HDD_START	0
#define HDD_1DOT	1
#define HDD_2DOT	2
#define HDD_OK		3

int hasdotdot(const char *path)
{
	int state = HDD_START;

	while(*path) {
		switch(*path) {
			case '.':
				if (state == HDD_START)
					state = HDD_1DOT;
				else if (state == HDD_1DOT)
					state = HDD_2DOT;
				else
					state = HDD_OK;
				break;
			case '/':
				if (state == HDD_2DOT)
					return 1; /* '/../' found */

				state = HDD_START;
				break;
			default:
				state = HDD_OK;
				break;
		}

		path++;
	}

	return (state == HDD_2DOT);
}

#define NARGS	5
char *concat5(char *a, char *b, char *c, char *d, char *e)
{
	char *src[NARGS] = { a, b, c, d, e, };
	size_t len[NARGS]; /* source lengths */
	size_t totallen; /* total output string len */
	unsigned tofree; /* what to free bitmap */
	char *ret, *out;
	int first, last; /* the first and last non-NULL index */
	int nsrc; /* number of non-NULL sources */
	int i, j;

	nsrc = 0;
	totallen = 0;
	first = -1;
	last = -1;
	tofree = 0x1f;

	for (i = 0; i < 5; i++) {
		len[i] = 0;

		if (src[i]) {
			len[i] = strlen(src[i]);

			last = i;
			if (first == -1)
				first = i;

			nsrc++;

			for (j = i + 1; j < 5; j++)
				if (src[i] == src[j])
					tofree &= ~(1 << i);
		}

		totallen += len[i];
	}

	if (nsrc == 1)
		return src[first];

	if (!totallen) {
		for (i = first; i < last; i++)
			if (tofree & (1 << i))
				free(src[i]);

		return xstrdup("");
	}

	ret = malloc(totallen + 1);
	ASSERT(ret);

	out = ret;

	for (i = first; i <= last; i++) {
		if (!src[i])
			continue;

		/* copy the source */
		strcpy(out, src[i]);

		/* advance the output */
		out += len[i];

		if (tofree & (1 << i))
			free(src[i]);
	}

	/*
	 * We're guaranteed that the above loop executed at least once, and
	 * therefore the output is null-terminated
	 */

	return ret;
}

time_t parse_time_cstr(const char *str)
{
	struct tm tm;

	if (!str)
		return 0;

	/* some implementations of strptime don't reset values not parsed */
	memset(&tm, 0, sizeof(struct tm));

	strptime(str, "%Y-%m-%d %H:%M", &tm);

	return mktime(&tm);
}