diff options
author | Berke Viktor <bviktor@hexchat.org> | 2012-10-21 06:44:29 +0200 |
---|---|---|
committer | Berke Viktor <bviktor@hexchat.org> | 2012-10-21 06:44:29 +0200 |
commit | 187351fa61e0ec9e8fe396de7a1d72a3a67d328f (patch) | |
tree | 46c15ce40d623ab8398073fe15c7af74eeb49f93 /plugins/sysinfo/match.c | |
parent | cb891a9732d77dde425052b6d11dc8024492e80a (diff) |
Add vanilla X-Sys sources
Diffstat (limited to 'plugins/sysinfo/match.c')
-rw-r--r-- | plugins/sysinfo/match.c | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/plugins/sysinfo/match.c b/plugins/sysinfo/match.c new file mode 100644 index 00000000..64d7a062 --- /dev/null +++ b/plugins/sysinfo/match.c @@ -0,0 +1,229 @@ +/* + * match.c - matching functions for X-Sys + * Copyright (C) 2005, 2006, 2007 Tony Vroon + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <unistd.h> +#include "xsys.h" + +extern int percentages; + +float percentage(unsigned long long *free, unsigned long long *total) +{ + unsigned long long result = (*free) * (unsigned long long)1000 / (*total); + return result / 10.0; +} + +char *pretty_freespace(const char *desc, unsigned long long *free_k, unsigned long long *total_k) +{ + char *result, *bytesize; + double free_space, total_space; + free_space = *free_k; + total_space = *total_k; + result = malloc(bsize * sizeof(char)); + bytesize = malloc(3 * sizeof(char)); + const char *quantities = "KB\0MB\0GB\0TB\0PB\0EB\0ZB\0YB\0"; + int i=0; + if (total_space == 0) + { + snprintf(result, bsize, "%s: none", desc); + return result; + } + while (total_space > 1023 && i <= 14) + { + i=i+3; + *bytesize=*(quantities+i); + *(bytesize+1)=*(quantities+i+1); + *(bytesize+2)=*(quantities+i+2); + free_space = free_space / 1024; + total_space = total_space / 1024; + } + if (percentages != 0) + snprintf(result, bsize, "%s: %.1f%s, %.1f%% free", + desc, total_space, bytesize, + percentage(free_k, total_k)); + else + snprintf(result, bsize, "%s: %.1f%s/%.1f%s free", + desc, free_space, bytesize, total_space, bytesize); + return result; +} + +void remove_leading_whitespace(char *buffer) +{ + char *pos; + while((pos = memchr(buffer, 0x20, 1))) + { + pos += 1; + strcpy(buffer, pos); + } +} + +char *decruft_filename(char *buffer) +{ + char *match, *match_end; + + while ((match = strstr(buffer, "%20"))) + { + match_end = match + 3; + *match++ = ' '; + while (*match_end) + *match++ = *match_end++; + *match = 0; + } + return buffer; +} + +void find_match_char(char *buffer, char *match, char *result) +{ + char *position; + remove_leading_whitespace(buffer); + if(strstr(buffer, match) == strstr(buffer, buffer)) + { + position = strpbrk(buffer, delims); + if (position != NULL) { + position += 1; + strcpy(result, position); + position = strstr(result, "\n"); + *(position) = '\0'; + remove_leading_whitespace(result); + } + else + strcpy(result, "\0"); + } +} + +void find_match_double(char *buffer, char *match, double *result) +{ + char *position; + remove_leading_whitespace(buffer); + if(strstr(buffer, match) == strstr(buffer, buffer)) + { + position = strpbrk(buffer, delims); + if (position != NULL) { + position += 1; + *result = strtod(position, NULL); + } + else + *result = 0; + } +} + +void find_match_double_hex(char *buffer, char *match, double *result) +{ + char *position; + remove_leading_whitespace(buffer); + if(strstr(buffer, match) == strstr(buffer, buffer)) + { + position = strpbrk(buffer, delims); + if (position != NULL) { + memcpy(position,"0x",2); + *result = strtod(position,NULL); + } + else + *result = 0; + } +} + +void find_match_int(char *buffer, char *match, unsigned int *result) +{ + char *position; + remove_leading_whitespace(buffer); + if(strstr(buffer, match) == strstr(buffer, buffer)) + { + position = strpbrk(buffer, delims); + if (position != NULL) { + position += 1; + *result = atoi(position); + } + else + *result = 0; + } +} + +void find_match_ll(char *buffer, char *match, unsigned long long *result) +{ + char *position; + remove_leading_whitespace(buffer); + if(strstr(buffer, match) == strstr(buffer, buffer)) + { + position = strpbrk(buffer, delims); + if (position != NULL) { + position += 1; + *result = strtoll(position, NULL, 10); + } + else + *result = 0; + } +} + +void format_output(const char *arg, char *string, char *format) +{ + char *pos1, *pos2, buffer[bsize]; + pos1 = &format[0]; + strncpy(buffer, string, bsize); + string[0] = '\0'; + + while((pos2 = strstr(pos1, "%")) != NULL) + { + strncat(string, pos1, (size_t)(pos2-pos1)); + if(*(pos2+1) == '1') + strcat(string, arg); + else if(*(pos2+1) == '2') + strcat(string, buffer); + else if(*(pos2+1) == 'C' || *(pos2+1) == 'c') + strcat(string, "\003"); + else if(*(pos2+1) == 'B' || *(pos2+1) == 'b') + strcat(string, "\002"); + else if(*(pos2+1) == 'R' || *(pos2+1) == 'r') + strcat(string, "\026"); + else if(*(pos2+1) == 'O' || *(pos2+1) == 'o') + strcat(string, "\017"); + else if(*(pos2+1) == 'U' || *(pos2+1) == 'u') + strcat(string, "\037"); + else if(*(pos2+1) == '%') + strcat(string, "%"); + pos1=pos2+2; + } + + strcat(string, pos1); +} + +void flat_format_output(const char *arg, char *string, char *format) +{ + char *pos1, *pos2, buffer[bsize]; + pos1 = &format[0]; + strncpy(buffer, string, bsize); + string[0] = '\0'; + + while((pos2 = strstr(pos1, "%")) != NULL) + { + strncat(string, pos1, (size_t)(pos2-pos1)); + if(*(pos2+1) == '1') + strcat(string, arg); + else if(*(pos2+1) == '2') + strcat(string, buffer); + else if(*(pos2+1) == '%') + strcat(string, "%"); + pos1=pos2+2; + } + + strcat(string, pos1); +} |