/* $Id: tools.c 328 2006-01-07 17:36:15Z tsaviran $ * ------------------------------------------------------- * Copyright (C) 2002-2005 Tommi Saviranta * ------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifdef HAVE_CONFIG_H #include #endif /* ifdef HAVE_CONFIG_H */ #include "tools.h" #include #include #include #include /** * Convert to upper case. * @str: String to convert */ void upcase(char *str) { char *ptr; for (ptr = str; ptr != NULL && *ptr != '\0'; ptr++) { *ptr = (char) toupper((int) *ptr); } } /* void upcade(char *str) */ /** * Convert to lower case. * @str: String to convert */ void lowcase(char *str) { char *ptr; for (ptr = str; ptr != NULL && *ptr != '\0'; ptr++) { *ptr = (char) tolower((int) *ptr); } } /* void lowcase(char *str) */ /** * Generates a random string or new nick out of the old one. * @target: Target. It *target != '\0', target will be treated as old nick. * If *target == '\0', completely random string will be created. * @length: (Maximum) length for target * @fillchar: Character to use pad undersized target * * Target must have space for length + 1 characters. * * This function doesn't work with multibyte characters. */ void randname(char *target, const size_t length, const char fillchar) { size_t oldlen; char shift; /* TODO paranoia */ if (target == NULL) { /* No target - nothing to do. */ return; } /* Genereate from scratch? */ if (target[0] == '\0') { size_t i; for (i = 0; i < length; i++) { /* * Using rand() here could be unwise due to bad * randomness of it. We ignore the threat, as * a) user can always run mkpasswd, * b) knowing the password _should_ only expose * your IRC client for public, not your computer */ target[i] = (char)('A' + (rand() % 56)); } target[length] = '\0'; return; } /* Try to generate a new nick from the old one. */ oldlen = strlen(target); if (oldlen < length) { /* * Nick is shorter than maximum length, try adding fillchar * at the end. */ target[oldlen] = fillchar; target[oldlen + 1] = '\0'; return; } /* Nick is already as long as it can be. Try rotating the nick. */ shift = target[length - 1]; memmove(target + 1, target, length - 1); target[0] = shift; } /* void randname(char *target, const size_t length, const char fillchar) */ /** * Returns index of first occurance of "c" in "str". * @str: String to look from * @c: Character to find * * Returns: Index of last occurance of "c" in "str". -1 if "c" was not found. * * This function does _not_ work with multibyte characters. We get "int c" * instead of "char c" so that this could be fixed without major rewriting. */ int pos(const char *s, const int c) { /* It takes less space to do this than to use strchr. */ int i; for (i = 0; s[i] != '\0'; i++) { if (s[i] == c) { return i; } } return -1; } /* int pos(const char *s, const int c) */ /** * Returns index of last occurance of "c" in "str". * @str: String to look from * @c: Character to find * * Returns: Index of last occurance of "c" in "str". -1 if "c" was not found. * * This function does _not_ work with multibyte characters. We get "int c" * instead of "char c" so that this could be fixed without major rewriting. */ int lastpos(const char *s, const int c) { /* It takes less space to do this than to use strchr. */ int i; if (s == NULL) { return -1; } for (i = strlen(s); i >= 0; i--) { if (s[i] == c) { return i; } } return -1; } /* int lastpos(const char *s, const int c) */ /** * Finds next word starting from s. * @s: Where to start searching. * * Returns: Pointer to stuff starting from next word, NULL if there are no * words left. */ char * nextword(char *s) { int i; i = pos(s, ' '); if (i == -1) { return NULL; } else { return s + i + 1; } } /* char *nextword(char *s) */ /** * Finds last word, starting from s. * @s: Where to start searching. * * Returns: Pointer to last word, NULL if there are no words before s. */ char * lastword(char *s) { int i; i = lastpos(s, ' '); if (i == -1) { return s; } else { return s + i + 1; } } /* char *lastword(char *s) */ #ifdef UPTIME void getuptime(time_t now, int *days, int *hours, int *minutes, int *seconds) { *days = now / 86400; now %= 86400; *hours = now / 3600; now %= 3600; *minutes = now / 60; *seconds = now % 60; } /* void getuptime(time_t now, int *days, int *hours, int *minutes, int *seconds) */ #endif /* UPTIME */ /** * Creates a timestamp. * @t: Pointer to time, NULL if current time. * @mode: Timestamp format * * Returns: Pointer to timestamp. Allocated memory must not be freed. * * Creates timestamps like: * Sun Jan 02 11:53:33 2002 * or * Jan 02 11:53:33 */ const char * get_timestamp(time_t *t, const timestamp_t mode) { struct tm *form; static char stamp[100]; time_t ts; if (t == NULL) { time(&ts); } else { ts = *t; } form = localtime(&ts); switch (mode) { case TIMESTAMP_LONG: strftime(stamp, 99, "%a %b %d %H:%M:%S %Y", form); break; case TIMESTAMP_SHORT: strftime(stamp, 99, "%b %d %H:%M:%S", form); } stamp[99] = '\0'; return stamp; } /* char *get_timestamp(time_t *t, const timestamp_t mode) */ /** * Creates a short current timestamp. * * Returns: Pointer to timestamp. Allocated memory must not be freed. * * Creates a timestamp like: "Jan 02 11:53:33" */ const char * get_short_localtime(void) { /* termination guaranteed in get_timestamp() */ return get_timestamp(NULL, TIMESTAMP_SHORT); } /* const char *get_short_localtime(void) */