diff --git a/src/Makefile.am b/src/Makefile.am
index a03232f9..f22eddae 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -49,13 +49,13 @@ $(config_output): ${config_input}
endif # BUILD_CONFIG_OUTPUT
# source files always needed for compiling
-mandatory_sources = colours.c colours.h common.c common.h conky.c conky.h \
- core.c core.h diskio.c diskio.h exec.c exec.h fs.c fs.h logging.h \
- mail.c mail.h mixer.c mixer.h template.c template.h timed_thread.c \
- timed_thread.h mboxscan.c mboxscan.h read_tcp.c read_tcp.h scroll.c \
- scroll.h specials.c specials.h tailhead.c tailhead.h temphelper.c \
- temphelper.h text_object.c text_object.h timeinfo.c timeinfo.h \
- algebra.c algebra.h
+mandatory_sources = colours.c colours.h combine.c combine.h common.c common.h \
+ conky.c conky.h core.c core.h diskio.c diskio.h exec.c exec.h fs.c \
+ fs.h logging.h mail.c mail.h mixer.c mixer.h template.c template.h \
+ timed_thread.c timed_thread.h mboxscan.c mboxscan.h read_tcp.c \
+ read_tcp.h scroll.c scroll.h specials.c specials.h tailhead.c \
+ tailhead.h temphelper.c temphelper.h text_object.c text_object.h \
+ timeinfo.c timeinfo.h algebra.c algebra.h
# source files only needed when the apropriate option is enabled
audacious = audacious.c audacious.h
diff --git a/src/combine.c b/src/combine.c
new file mode 100644
index 00000000..99632623
--- /dev/null
+++ b/src/combine.c
@@ -0,0 +1,163 @@
+/* -*- mode: c; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: t -*-
+ * vim: ts=4 sw=4 noet ai cindent syntax=c
+ *
+ * Conky, a system monitor, based on torsmo
+ *
+ * Any original torsmo code is licensed under the BSD license
+ *
+ * All code written since the fork of torsmo is licensed under the GPL
+ *
+ * Please see COPYING for details
+ *
+ * Copyright (c) 2004, Hannu Saransaari and Lauri Hakkarainen
+ * Copyright (c) 2005-2009 Brenden Matthews, Philip Kovacs, et. al.
+ * (see AUTHORS)
+ * All rights reserved.
+ *
+ * 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 3 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, see .
+ *
+ */
+#include "core.h"
+#include "logging.h"
+#include "text_object.h"
+
+void parse_combine_arg(struct text_object *obj, const char *arg, void *free_at_crash)
+{
+ unsigned int i,j;
+ unsigned int indenting = 0; //vars can be used as args for other vars
+ int startvar[2];
+ int endvar[2];
+ startvar[0] = endvar[0] = startvar[1] = endvar[1] = -1;
+ j=0;
+ for (i=0; arg[i] != 0 && j < 2; i++) {
+ if(startvar[j] == -1) {
+ if(arg[i] == '$') {
+ startvar[j] = i;
+ }
+ }else if(endvar[j] == -1) {
+ if(arg[i] == '{') {
+ indenting++;
+ }else if(arg[i] == '}') {
+ indenting--;
+ }
+ if (indenting == 0 && arg[i+1] < 48) { //<48 has 0, $, and the most used chars not used in varnames but not { or }
+ endvar[j]=i+1;
+ j++;
+ }
+ }
+ }
+ if(startvar[0] >= 0 && endvar[0] >= 0 && startvar[1] >= 0 && endvar[1] >= 0) {
+ obj->data.combine.left = malloc(endvar[0]-startvar[0] + 1);
+ obj->data.combine.seperation = malloc(startvar[1] - endvar[0] + 1);
+ obj->data.combine.right= malloc(endvar[1]-startvar[1] + 1);
+
+ strncpy(obj->data.combine.left, arg + startvar[0], endvar[0] - startvar[0]);
+ obj->data.combine.left[endvar[0] - startvar[0]] = 0;
+
+ strncpy(obj->data.combine.seperation, arg + endvar[0], startvar[1] - endvar[0]);
+ obj->data.combine.seperation[startvar[1] - endvar[0]] = 0;
+
+ strncpy(obj->data.combine.right, arg + startvar[1], endvar[1] - startvar[1]);
+ obj->data.combine.right[endvar[1] - startvar[1]] = 0;
+
+ obj->sub = malloc(sizeof(struct text_object));
+ extract_variable_text_internal(obj->sub, obj->data.combine.left);
+ obj->sub->sub = malloc(sizeof(struct text_object));
+ extract_variable_text_internal(obj->sub->sub, obj->data.combine.right);
+ } else {
+ CRIT_ERR(obj, free_at_crash, "combine needs arguments: ");
+ }
+}
+
+void print_combine(struct text_object *obj, char *p, struct information *cur)
+{
+ char buf[2][max_user_text];
+ int i, j;
+ long longest=0;
+ int nextstart;
+ int nr_rows[2];
+ struct llrows {
+ char* row;
+ struct llrows* next;
+ };
+ struct llrows *ll_rows[2], *current[2];
+ struct text_object * objsub = obj->sub;
+
+ if (!cd)
+ return;
+
+ p[0]=0;
+ for(i=0; i<2; i++) {
+ nr_rows[i] = 1;
+ nextstart = 0;
+ ll_rows[i] = malloc(sizeof(struct llrows));
+ current[i] = ll_rows[i];
+ for(j=0; jsub;
+ generate_text_internal(buf[i], max_user_text, *objsub, cur);
+ for(j=0; buf[i][j] != 0; j++) {
+ if(buf[i][j] == '\t') buf[i][j] = ' ';
+ if(buf[i][j] == '\n') {
+ buf[i][j] = 0;
+ current[i]->row = strdup(buf[i]+nextstart);
+ if(i==0 && (long)strlen(current[i]->row) > longest) longest = (long)strlen(current[i]->row);
+ current[i]->next = malloc(sizeof(struct llrows));
+ current[i] = current[i]->next;
+ nextstart = j + 1;
+ nr_rows[i]++;
+ }
+ }
+ current[i]->row = strdup(buf[i]+nextstart);
+ if(i==0 && (long)strlen(current[i]->row) > longest) longest = (long)strlen(current[i]->row);
+ current[i]->next = NULL;
+ current[i] = ll_rows[i];
+ }
+ for(j=0; j < (nr_rows[0] > nr_rows[1] ? nr_rows[0] : nr_rows[1] ); j++) {
+ if(current[0]) {
+ strcat(p, current[0]->row);
+ i=strlen(current[0]->row);
+ }else i = 0;
+ while(i < longest) {
+ strcat(p, " ");
+ i++;
+ }
+ if(current[1]) {
+ strcat(p, obj->data.combine.seperation);
+ strcat(p, current[1]->row);
+ }
+ strcat(p, "\n");
+#ifdef HAVE_OPENMP
+#pragma omp parallel for schedule(dynamic,10)
+#endif /* HAVE_OPENMP */
+ for(i=0; i<2; i++) if(current[i]) current[i]=current[i]->next;
+ }
+#ifdef HAVE_OPENMP
+#pragma omp parallel for schedule(dynamic,10)
+#endif /* HAVE_OPENMP */
+ for(i=0; i<2; i++) {
+ while(ll_rows[i] != NULL) {
+ current[i]=ll_rows[i];
+ free(current[i]->row);
+ ll_rows[i]=current[i]->next;
+ free(current[i]);
+ }
+ }
+}
+
+void free_combine(struct text_object *obj)
+{
+ free(obj->data.combine.left);
+ free(obj->data.combine.seperation);
+ free(obj->data.combine.right);
+ free_text_objects(obj->sub, 1);
+ free(obj->sub);
+}
diff --git a/src/combine.h b/src/combine.h
new file mode 100644
index 00000000..22042c57
--- /dev/null
+++ b/src/combine.h
@@ -0,0 +1,37 @@
+/* -*- mode: c; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: t -*-
+ * vim: ts=4 sw=4 noet ai cindent syntax=c
+ *
+ * Conky, a system monitor, based on torsmo
+ *
+ * Any original torsmo code is licensed under the BSD license
+ *
+ * All code written since the fork of torsmo is licensed under the GPL
+ *
+ * Please see COPYING for details
+ *
+ * Copyright (c) 2004, Hannu Saransaari and Lauri Hakkarainen
+ * Copyright (c) 2005-2009 Brenden Matthews, Philip Kovacs, et. al.
+ * (see AUTHORS)
+ * All rights reserved.
+ *
+ * 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 3 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, see .
+ *
+ */
+#ifndef _COMBINE_H
+#define _COMBINE_H
+
+void parse_combine_arg(struct text_object *, const char *, void *);
+void print_combine(struct text_object *, char *, struct information *);
+void free_combine(struct text_object *);
+
+#endif /* _COMBINE_H */
diff --git a/src/conky.c b/src/conky.c
index 4fcad2cb..fb235fa9 100644
--- a/src/conky.c
+++ b/src/conky.c
@@ -75,6 +75,7 @@
#include "algebra.h"
#include "build.h"
#include "colours.h"
+#include "combine.h"
#include "diskio.h"
#include "exec.h"
#ifdef X11
@@ -2530,73 +2531,7 @@ void generate_text_internal(char *p, int p_max_size,
print_scroll(obj, p, p_max_size, cur);
}
OBJ(combine) {
- char buf[2][max_user_text];
- int i, j;
- long longest=0;
- int nextstart;
- int nr_rows[2];
- struct llrows {
- char* row;
- struct llrows* next;
- };
- struct llrows *ll_rows[2], *current[2];
- struct text_object * objsub = obj->sub;
-
- p[0]=0;
- for(i=0; i<2; i++) {
- nr_rows[i] = 1;
- nextstart = 0;
- ll_rows[i] = malloc(sizeof(struct llrows));
- current[i] = ll_rows[i];
- for(j=0; jsub;
- generate_text_internal(buf[i], max_user_text, *objsub, cur);
- for(j=0; buf[i][j] != 0; j++) {
- if(buf[i][j] == '\t') buf[i][j] = ' ';
- if(buf[i][j] == '\n') {
- buf[i][j] = 0;
- current[i]->row = strdup(buf[i]+nextstart);
- if(i==0 && (long)strlen(current[i]->row) > longest) longest = (long)strlen(current[i]->row);
- current[i]->next = malloc(sizeof(struct llrows));
- current[i] = current[i]->next;
- nextstart = j + 1;
- nr_rows[i]++;
- }
- }
- current[i]->row = strdup(buf[i]+nextstart);
- if(i==0 && (long)strlen(current[i]->row) > longest) longest = (long)strlen(current[i]->row);
- current[i]->next = NULL;
- current[i] = ll_rows[i];
- }
- for(j=0; j < (nr_rows[0] > nr_rows[1] ? nr_rows[0] : nr_rows[1] ); j++) {
- if(current[0]) {
- strcat(p, current[0]->row);
- i=strlen(current[0]->row);
- }else i = 0;
- while(i < longest) {
- strcat(p, " ");
- i++;
- }
- if(current[1]) {
- strcat(p, obj->data.combine.seperation);
- strcat(p, current[1]->row);
- }
- strcat(p, "\n");
- #ifdef HAVE_OPENMP
- #pragma omp parallel for schedule(dynamic,10)
- #endif /* HAVE_OPENMP */
- for(i=0; i<2; i++) if(current[i]) current[i]=current[i]->next;
- }
- #ifdef HAVE_OPENMP
- #pragma omp parallel for schedule(dynamic,10)
- #endif /* HAVE_OPENMP */
- for(i=0; i<2; i++) {
- while(ll_rows[i] != NULL) {
- current[i]=ll_rows[i];
- free(current[i]->row);
- ll_rows[i]=current[i]->next;
- free(current[i]);
- }
- }
+ print_combine(obj, p, cur);
}
#ifdef NVIDIA
OBJ(nvidia) {
diff --git a/src/core.c b/src/core.c
index 51412c16..4db44eaa 100644
--- a/src/core.c
+++ b/src/core.c
@@ -34,6 +34,7 @@
#include "algebra.h"
#include "build.h"
#include "colours.h"
+#include "combine.h"
#include "diskio.h"
#include "exec.h"
#ifdef X11
@@ -1445,50 +1446,7 @@ struct text_object *construct_text_object(const char *s, const char *arg, long
END OBJ(scroll, 0)
parse_scroll_arg(obj, arg, free_at_crash);
END OBJ_ARG(combine, 0, "combine needs arguments: ")
- unsigned int i,j;
- unsigned int indenting = 0; //vars can be used as args for other vars
- int startvar[2];
- int endvar[2];
- startvar[0] = endvar[0] = startvar[1] = endvar[1] = -1;
- j=0;
- for (i=0; arg[i] != 0 && j < 2; i++) {
- if(startvar[j] == -1) {
- if(arg[i] == '$') {
- startvar[j] = i;
- }
- }else if(endvar[j] == -1) {
- if(arg[i] == '{') {
- indenting++;
- }else if(arg[i] == '}') {
- indenting--;
- }
- if (indenting == 0 && arg[i+1] < 48) { //<48 has 0, $, and the most used chars not used in varnames but not { or }
- endvar[j]=i+1;
- j++;
- }
- }
- }
- if(startvar[0] >= 0 && endvar[0] >= 0 && startvar[1] >= 0 && endvar[1] >= 0) {
- obj->data.combine.left = malloc(endvar[0]-startvar[0] + 1);
- obj->data.combine.seperation = malloc(startvar[1] - endvar[0] + 1);
- obj->data.combine.right= malloc(endvar[1]-startvar[1] + 1);
-
- strncpy(obj->data.combine.left, arg + startvar[0], endvar[0] - startvar[0]);
- obj->data.combine.left[endvar[0] - startvar[0]] = 0;
-
- strncpy(obj->data.combine.seperation, arg + endvar[0], startvar[1] - endvar[0]);
- obj->data.combine.seperation[startvar[1] - endvar[0]] = 0;
-
- strncpy(obj->data.combine.right, arg + startvar[1], endvar[1] - startvar[1]);
- obj->data.combine.right[endvar[1] - startvar[1]] = 0;
-
- obj->sub = malloc(sizeof(struct text_object));
- extract_variable_text_internal(obj->sub, obj->data.combine.left);
- obj->sub->sub = malloc(sizeof(struct text_object));
- extract_variable_text_internal(obj->sub->sub, obj->data.combine.right);
- } else {
- CRIT_ERR(obj, free_at_crash, "combine needs arguments: ");
- }
+ parse_combine_arg(obj, arg, free_at_crash);
#ifdef NVIDIA
END OBJ_ARG(nvidia, 0, "nvidia needs an argument")
if (set_nvidia_type(&obj->data.nvidia, arg)) {
@@ -2128,11 +2086,7 @@ void free_text_objects(struct text_object *root, int internal)
free_scroll(obj);
break;
case OBJ_combine:
- free(data.combine.left);
- free(data.combine.seperation);
- free(data.combine.right);
- free_text_objects(obj->sub, 1);
- free(obj->sub);
+ free_combine(obj);
break;
#ifdef APCUPSD
case OBJ_apcupsd: