aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2007-06-10 17:27:42 +0000
committergotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2007-06-10 17:27:42 +0000
commit8c0d0ee9ed9f4b7814df1b8168be4b8c6e3d5ccb (patch)
tree9aa115d3950842ea65ca4e38f70bdfe99a948758
parentf56eb1958726097b75ea13370188a9d8d2031591 (diff)
downloaddzen-8c0d0ee9ed9f4b7814df1b8168be4b8c6e3d5ccb.tar.gz
dzen-8c0d0ee9ed9f4b7814df1b8168be4b8c6e3d5ccb.zip
improved buffer handling:
malloc buffer buffer size is multiplier of dzen.slave_win.max_lines git-svn-id: http://dzen.googlecode.com/svn/trunk@77 f2baff5b-bf2c-0410-a398-912abdc3d8b2
-rw-r--r--draw.c14
-rw-r--r--dzen.h9
-rw-r--r--main.c32
3 files changed, 40 insertions, 15 deletions
diff --git a/draw.c b/draw.c
index c98ae77..0af693b 100644
--- a/draw.c
+++ b/draw.c
@@ -165,11 +165,11 @@ drawheader(char * text) {
}
void
- drawbody(char * text) {
- if(dzen.slave_win.tcnt >= BUF_SIZE)
- free_buffer();
- if(dzen.slave_win.tcnt < BUF_SIZE) {
- dzen.slave_win.tbuf[dzen.slave_win.tcnt] = estrdup(text);
- dzen.slave_win.tcnt++;
- }
+drawbody(char * text) {
+ if(dzen.slave_win.tcnt == dzen.slave_win.tsize)
+ free_buffer();
+ if(dzen.slave_win.tcnt < dzen.slave_win.tsize) {
+ dzen.slave_win.tbuf[dzen.slave_win.tcnt] = estrdup(text);
+ dzen.slave_win.tcnt++;
}
+}
diff --git a/dzen.h b/dzen.h
index 34a68da..b4a3f37 100644
--- a/dzen.h
+++ b/dzen.h
@@ -17,7 +17,8 @@
#define ALIGNLEFT 1
#define ALIGNRIGHT 2
-#define BUF_SIZE 4096
+#define MIN_BUF_SIZE 512
+#define MAX_LINE_LEN 512
/* gui data structures */
enum { ColFG, ColBG, ColLast };
@@ -53,8 +54,12 @@ struct SW {
Window *line;
Drawable *drawable;
- char *tbuf[BUF_SIZE];
+ //char *tbuf[BUF_SIZE];
+ /* input buffer */
+ char **tbuf;
+ int tsize;
int tcnt;
+
int max_lines;
int first_line_vis;
int last_line_vis;
diff --git a/main.c b/main.c
index 75780e3..2a1af5d 100644
--- a/main.c
+++ b/main.c
@@ -113,15 +113,19 @@ chomp(char *inbuf, char *outbuf, int start, int len) {
void
free_buffer(void) {
int i;
- for(i=0; i<BUF_SIZE; i++)
+ for(i=0; i<dzen.slave_win.tsize; i++) {
free(dzen.slave_win.tbuf[i]);
- dzen.slave_win.tcnt = 0;
- last_cnt = 0;
+ dzen.slave_win.tbuf[i] = NULL;
+ }
+ dzen.slave_win.tcnt =
+ dzen.slave_win.last_line_vis =
+ last_cnt = 0;
}
static int
read_stdin(void *ptr) {
- char buf[1024], retbuf[2048];
+ char buf[MAX_LINE_LEN],
+ retbuf[MAX_LINE_LEN];
ssize_t n, n_off=0;
if(!(n = read(STDIN_FILENO, buf, sizeof buf))) {
@@ -139,7 +143,7 @@ read_stdin(void *ptr) {
drawheader(retbuf);
else if(!dzen.slave_win.ishmenu
&& !dzen.tsupdate
- && !dzen.cur_line || !dzen.slave_win.max_lines)
+ && ((dzen.cur_line == 0) || !dzen.slave_win.max_lines))
drawheader(retbuf);
else
drawbody(retbuf);
@@ -553,6 +557,19 @@ set_alignment(void) {
}
}
+static void
+init_input_buffer() {
+
+ if(MIN_BUF_SIZE % dzen.slave_win.max_lines)
+ dzen.slave_win.tsize = MIN_BUF_SIZE + (dzen.slave_win.max_lines - (MIN_BUF_SIZE % dzen.slave_win.max_lines));
+ else
+ dzen.slave_win.tsize = MIN_BUF_SIZE;
+
+ printf("Buffer: %d\n", dzen.slave_win.tsize);
+ fflush(stdout);
+ dzen.slave_win.tbuf = emalloc(dzen.slave_win.tsize);
+}
+
int
main(int argc, char *argv[]) {
int i;
@@ -578,7 +595,10 @@ main(int argc, char *argv[]) {
/* cmdline args */
for(i = 1; i < argc; i++)
if(!strncmp(argv[i], "-l", 3)){
- if(++i < argc) dzen.slave_win.max_lines = atoi(argv[i]);
+ if(++i < argc) {
+ dzen.slave_win.max_lines = atoi(argv[i]);
+ init_input_buffer();
+ }
}
else if(!strncmp(argv[i], "-u", 3)){
dzen.tsupdate = True;