mcabber/src/hbuf.c
author Mikael Berthe <mikael@lilotux.net>
Sat, 08 Jul 2006 09:40:05 +0200
changeset 930 a75f7a13df7b
parent 924 a07bd351008b
child 932 fc6aaa223650
permissions -rw-r--r--
UTF-8 terminal support (Reimar Döffinger) This is a patch from Reimar Döffinger, slightly modified, which makes mcabber work better on UTF-8 terminals.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
     1
/*
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
     2
 * hbuf.c       -- History buffer implementation
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 392
diff changeset
     3
 *
699
ee03b56b93ee Update Copyright (2006)
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
     4
 * Copyright (C) 2005, 2006 Mikael Berthe <bmikael@lists.lilotux.net>
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
     5
 *
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
     8
 * the Free Software Foundation; either version 2 of the License, or (at
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
     9
 * your option) any later version.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    10
 *
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful, but
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    14
 * General Public License for more details.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    15
 *
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    17
 * along with this program; if not, write to the Free Software
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    19
 * USA
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    20
 */
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    21
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    22
#include <string.h>
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    23
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    24
#include "hbuf.h"
804
339c76ed5c0d Remove a warning on Cygwin (implicit strcasestr() declaration)
Mikael Berthe <mikael@lilotux.net>
parents: 790
diff changeset
    25
#include "utils.h"
930
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
    26
#include "utf8.h"
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    27
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    28
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    29
/* This is a private structure type */
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    30
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    31
typedef struct {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    32
  char *ptr;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
    33
  char *ptr_end;        // beginning of the block
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
    34
  char *ptr_end_alloc;  // end of the current persistent block
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    35
  guchar flags;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    36
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    37
  // XXX This should certainly be a pointer, and be allocated only when needed
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    38
  // (for ex. when HBB_FLAG_PERSISTENT is set).
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    39
  struct { // hbuf_line_info
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
    40
    time_t timestamp;
850
d0781ca2dd08 Use new status buffer window
Mikael Berthe <mikael@lilotux.net>
parents: 804
diff changeset
    41
    guint  flags;
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
    42
  } prefix;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    43
} hbuf_block;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    44
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    45
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
    46
//  hbuf_add_line(p_hbuf, text, prefix_flags, width)
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    47
// Add a line to the given buffer.  If width is not null, then lines are
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    48
// wrapped at this length.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    49
//
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    50
// Note 1: Splitting according to width won't work if there are tabs; they
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    51
//         should be expanded before.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    52
// Note 2: width does not include the ending \0.
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
    53
void hbuf_add_line(GList **p_hbuf, const char *text, time_t timestamp,
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
    54
        guint prefix_flags, guint width)
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    55
{
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    56
  GList *hbuf = *p_hbuf;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    57
  char *line, *cr, *end;
83
a95e2fc9ea6b [/trunk] Changeset 97 by mikael
mikael
parents: 75
diff changeset
    58
  hbuf_block *hbuf_block_elt;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    59
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    60
  if (!text) return;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    61
83
a95e2fc9ea6b [/trunk] Changeset 97 by mikael
mikael
parents: 75
diff changeset
    62
  hbuf_block_elt = g_new0(hbuf_block, 1);
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
    63
  hbuf_block_elt->prefix.timestamp  = timestamp;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
    64
  hbuf_block_elt->prefix.flags      = prefix_flags;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    65
  if (!hbuf) {
390
468c9cac2798 Minor changes to hbuf.c
Mikael Berthe <mikael@lilotux.net>
parents: 370
diff changeset
    66
    hbuf_block_elt->ptr  = g_new(char, HBB_BLOCKSIZE);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    67
    hbuf_block_elt->flags  = HBB_FLAG_ALLOC | HBB_FLAG_PERSISTENT;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
    68
    hbuf_block_elt->ptr_end_alloc = hbuf_block_elt->ptr + HBB_BLOCKSIZE;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    69
    *p_hbuf = g_list_append(*p_hbuf, hbuf_block_elt);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    70
  } else {
502
3134b4960cdb Fix mixed declaration and code
Mikael Berthe <mikael@lilotux.net>
parents: 464
diff changeset
    71
    hbuf_block *hbuf_b_prev;
392
6329c9601704 Speed up hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 390
diff changeset
    72
    // Set p_hbuf to the end of the list, to speed up history loading
6329c9601704 Speed up hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 390
diff changeset
    73
    // (or CPU time will be used by g_list_last() for each line)
6329c9601704 Speed up hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 390
diff changeset
    74
    hbuf = *p_hbuf = g_list_last(*p_hbuf);
502
3134b4960cdb Fix mixed declaration and code
Mikael Berthe <mikael@lilotux.net>
parents: 464
diff changeset
    75
    hbuf_b_prev = hbuf->data;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    76
    hbuf_block_elt->ptr    = hbuf_b_prev->ptr_end;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    77
    hbuf_block_elt->flags  = HBB_FLAG_PERSISTENT;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
    78
    hbuf_block_elt->ptr_end_alloc = hbuf_b_prev->ptr_end_alloc;
790
5d4ad1d77da4 Kill a few gcc4 warnings
Mikael Berthe <mikael@lilotux.net>
parents: 733
diff changeset
    79
    *p_hbuf = g_list_append(*p_hbuf, hbuf_block_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    80
  }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    81
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    82
  if (strlen(text) >= HBB_BLOCKSIZE) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    83
    // Too long
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    84
    text = "[ERR:LINE_TOO_LONG]";
197
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 189
diff changeset
    85
    hbuf_block_elt->prefix.flags |= HBB_PREFIX_INFO;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    86
  }
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
    87
  if (hbuf_block_elt->ptr + strlen(text) >= hbuf_block_elt->ptr_end_alloc) {
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    88
    // Too long for the current allocated bloc, we need another one
390
468c9cac2798 Minor changes to hbuf.c
Mikael Berthe <mikael@lilotux.net>
parents: 370
diff changeset
    89
    hbuf_block_elt->ptr  = g_new0(char, HBB_BLOCKSIZE);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    90
    hbuf_block_elt->flags  = HBB_FLAG_ALLOC | HBB_FLAG_PERSISTENT;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
    91
    hbuf_block_elt->ptr_end_alloc = hbuf_block_elt->ptr + HBB_BLOCKSIZE;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    92
  }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    93
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    94
  line = hbuf_block_elt->ptr;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    95
  // Ok, now we can copy the text..
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    96
  strcpy(line, text);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    97
  hbuf_block_elt->ptr_end = line + strlen(line) + 1;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    98
  end = hbuf_block_elt->ptr_end;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
    99
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   100
  // Let's add non-persistent blocs if necessary
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   101
  // - If there are '\n' in the string
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   102
  // - If length > width (and width != 0)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   103
  cr = strchr(line, '\n');
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   104
  while (cr || (width && strlen(line) > width)) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   105
    hbuf_block *hbuf_b_prev = hbuf_block_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   106
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   107
    if (!width || (cr && (cr - line <= (int)width))) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   108
      // Carriage return
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   109
      *cr = 0;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   110
      hbuf_block_elt->ptr_end = cr;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   111
      // Create another persistent block
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   112
      hbuf_block_elt = g_new0(hbuf_block, 1);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   113
      hbuf_block_elt->ptr      = hbuf_b_prev->ptr_end + 1; // == cr+1
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   114
      hbuf_block_elt->ptr_end  = end;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   115
      hbuf_block_elt->flags    = HBB_FLAG_PERSISTENT;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
   116
      hbuf_block_elt->ptr_end_alloc = hbuf_b_prev->ptr_end_alloc;
790
5d4ad1d77da4 Kill a few gcc4 warnings
Mikael Berthe <mikael@lilotux.net>
parents: 733
diff changeset
   117
      *p_hbuf = g_list_append(*p_hbuf, hbuf_block_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   118
      line = hbuf_block_elt->ptr;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   119
    } else {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   120
      // We need to break where we can find a space char
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   121
      char *br; // break pointer
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   122
      for (br = line + width; br > line && *br != 32 && *br != 9; br--)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   123
        ;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   124
      if (br <= line)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   125
        br = line + width;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   126
      else
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   127
        br++;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   128
      hbuf_block_elt->ptr_end = br;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   129
      // Create another block, non-persistent
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   130
      hbuf_block_elt = g_new0(hbuf_block, 1);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   131
      hbuf_block_elt->ptr      = hbuf_b_prev->ptr_end; // == br
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   132
      hbuf_block_elt->ptr_end  = end;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   133
      hbuf_block_elt->flags    = 0;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
   134
      hbuf_block_elt->ptr_end_alloc = hbuf_b_prev->ptr_end_alloc;
790
5d4ad1d77da4 Kill a few gcc4 warnings
Mikael Berthe <mikael@lilotux.net>
parents: 733
diff changeset
   135
      *p_hbuf = g_list_append(*p_hbuf, hbuf_block_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   136
      line = hbuf_block_elt->ptr;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   137
    }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   138
    cr = strchr(line, '\n');
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   139
  }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   140
}
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   141
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   142
//  hbuf_free()
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   143
// Destroys all hbuf list.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   144
void hbuf_free(GList **p_hbuf)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   145
{
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   146
  hbuf_block *hbuf_b_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   147
  GList *hbuf_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   148
  GList *first_elt = g_list_first(*p_hbuf);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   149
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   150
  for (hbuf_elt = first_elt; hbuf_elt; hbuf_elt = g_list_next(hbuf_elt)) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   151
    hbuf_b_elt = (hbuf_block*)(hbuf_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   152
    if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   153
      g_free(hbuf_b_elt->ptr);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   154
    }
390
468c9cac2798 Minor changes to hbuf.c
Mikael Berthe <mikael@lilotux.net>
parents: 370
diff changeset
   155
    g_free(hbuf_b_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   156
  }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   157
893
92aaf2af786b Fix a small memory leak in /buffer purge
Mikael Berthe <mikael@lilotux.net>
parents: 852
diff changeset
   158
  g_list_free(first_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   159
  *p_hbuf = NULL;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   160
}
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   161
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   162
//  hbuf_rebuild()
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   163
// Rebuild all hbuf list, with the new width.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   164
// If width == 0, lines are not wrapped.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   165
void hbuf_rebuild(GList **p_hbuf, unsigned int width)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   166
{
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   167
  GList *first_elt, *curr_elt, *next_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   168
  hbuf_block *hbuf_b_curr, *hbuf_b_next;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   169
150
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
   170
  // *p_hbuf needs to be the head of the list
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
   171
  first_elt = *p_hbuf = g_list_first(*p_hbuf);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   172
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   173
  // #1 Remove non-persistent blocks (ptr_end should be updated!)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   174
  curr_elt = first_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   175
  while (curr_elt) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   176
    next_elt = g_list_next(curr_elt);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   177
    // Last element?
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   178
    if (!next_elt)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   179
      break;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   180
    hbuf_b_curr = (hbuf_block*)(curr_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   181
    hbuf_b_next = (hbuf_block*)(next_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   182
    // Is next line not-persistent?
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   183
    if (!(hbuf_b_next->flags & HBB_FLAG_PERSISTENT)) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   184
      hbuf_b_curr->ptr_end = hbuf_b_next->ptr_end;
390
468c9cac2798 Minor changes to hbuf.c
Mikael Berthe <mikael@lilotux.net>
parents: 370
diff changeset
   185
      g_free(hbuf_b_next);
790
5d4ad1d77da4 Kill a few gcc4 warnings
Mikael Berthe <mikael@lilotux.net>
parents: 733
diff changeset
   186
      curr_elt = g_list_delete_link(curr_elt, next_elt);
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 392
diff changeset
   187
    } else
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   188
      curr_elt = next_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   189
  }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   190
  // #2 Go back to head and create non-persistent blocks when needed
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   191
  if (width) {
930
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   192
    char *end;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   193
    curr_elt = first_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   194
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   195
    while (curr_elt) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   196
      hbuf_b_curr = (hbuf_block*)(curr_elt->data);
930
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   197
      hbuf_block *hbuf_b_prev = hbuf_b_curr;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   198
930
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   199
      // We need to break where we can find a space char
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   200
      char *br = NULL; // break pointer
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   201
      char *c = hbuf_b_curr->ptr;
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   202
      unsigned int cur_w = 0;
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   203
      while (*c && cur_w <= width) {
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   204
        if (iswblank(get_char(c)))
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   205
          br = c;
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   206
        cur_w += wcwidth(get_char(c));
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   207
        c = next_char(c);
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   208
      }
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   209
      if (*c && cur_w > width) {
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   210
        if (!br || br == hbuf_b_curr->ptr)
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   211
          br = c;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   212
        else
930
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
   213
          br = next_char(br);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   214
        end = hbuf_b_curr->ptr_end;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   215
        hbuf_b_curr->ptr_end = br;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   216
        // Create another block, non-persistent
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   217
        hbuf_b_curr = g_new0(hbuf_block, 1);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   218
        hbuf_b_curr->ptr      = hbuf_b_prev->ptr_end; // == br
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   219
        hbuf_b_curr->ptr_end  = end;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   220
        hbuf_b_curr->flags    = 0;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
   221
        hbuf_b_curr->ptr_end_alloc = hbuf_b_prev->ptr_end_alloc;
150
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
   222
        // This is OK because insert_before(NULL) == append():
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
   223
        *p_hbuf = g_list_insert_before(*p_hbuf, curr_elt->next, hbuf_b_curr);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   224
      }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   225
      curr_elt = g_list_next(curr_elt);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   226
    }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   227
  }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   228
}
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   229
189
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   230
//  hbuf_previous_persistent()
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   231
// Returns the previous persistent block (line).  If the given line is
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   232
// persistent, then it is returned.
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   233
// This function is used for example when resizing a buffer.  If the top of the
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   234
// screen is on a non-persistent block, then a screen resize could destroy this
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   235
// line...
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   236
GList *hbuf_previous_persistent(GList *l_line)
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   237
{
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   238
  hbuf_block *hbuf_b_elt;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   239
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   240
  while (l_line) {
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   241
    hbuf_b_elt = (hbuf_block*)l_line->data;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   242
    if (hbuf_b_elt->flags & HBB_FLAG_PERSISTENT)
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   243
      return l_line;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   244
    l_line = g_list_previous(l_line);
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   245
  }
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   246
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   247
  return NULL;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   248
}
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
   249
368
da50f08ea058 Update hbuf_get_lines() comment
Mikael Berthe <mikael@lilotux.net>
parents: 197
diff changeset
   250
//  hbuf_get_lines(hbuf, n)
370
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   251
// Returns an array of n hbb_line pointers
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   252
// (The first line will be the line currently pointed by hbuf)
898
c65b71dcda94 Fix memory leak in scr_UpdateWindow()
Mikael Berthe <mikael@lilotux.net>
parents: 893
diff changeset
   253
// Note: The caller should free the array, the hbb_line pointers and the
c65b71dcda94 Fix memory leak in scr_UpdateWindow()
Mikael Berthe <mikael@lilotux.net>
parents: 893
diff changeset
   254
// text pointers after use.
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
   255
hbb_line **hbuf_get_lines(GList *hbuf, unsigned int n)
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   256
{
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   257
  unsigned int i;
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   258
  hbuf_block *blk;
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   259
  guchar last_persist_prefixflags = 0;
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
   260
  GList *last_persist;  // last persistent flags
852
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
   261
  hbb_line **array, **array_elt;
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   262
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
   263
  // To be able to correctly highlight multi-line messages,
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
   264
  // we need to look at the last non-null prefix, which should be the first
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
   265
  // line of the message.
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   266
  last_persist = hbuf_previous_persistent(hbuf);
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
   267
  while (last_persist) {
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
   268
    blk = (hbuf_block*)last_persist->data;
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
   269
    if ((blk->flags & HBB_FLAG_PERSISTENT) && blk->prefix.flags) {
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
   270
      last_persist_prefixflags = blk->prefix.flags;
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
   271
      break;
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
   272
    }
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
   273
    last_persist = g_list_previous(last_persist);
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   274
  }
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   275
852
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
   276
  array = g_new0(hbb_line*, n);
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
   277
  array_elt = array;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   278
852
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
   279
  for (i = 0 ; i < n ; i++) {
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   280
    if (hbuf) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   281
      int maxlen;
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   282
      blk = (hbuf_block*)(hbuf->data);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   283
      maxlen = blk->ptr_end - blk->ptr;
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
   284
      *array_elt = (hbb_line*)g_new(hbb_line, 1);
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
   285
      (*array_elt)->timestamp = blk->prefix.timestamp;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
   286
      (*array_elt)->flags     = blk->prefix.flags;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
   287
      (*array_elt)->text      = g_strndup(blk->ptr, maxlen);
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
   288
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
   289
      if ((blk->flags & HBB_FLAG_PERSISTENT) && blk->prefix.flags) {
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   290
        last_persist_prefixflags = blk->prefix.flags;
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   291
      } else {
852
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
   292
        // Propagate highlighting flag
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   293
        (*array_elt)->flags |= last_persist_prefixflags & HBB_PREFIX_HLIGHT;
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   294
      }
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   295
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   296
      hbuf = g_list_next(hbuf);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   297
    } else
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
   298
      break;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
   299
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
   300
    array_elt++;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   301
  }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   302
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   303
  return array;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   304
}
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
   305
370
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   306
//  hbuf_search(hbuf, direction, string)
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   307
// Look backward/forward for a line containing string in the history buffer
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   308
// Search starts at hbuf, and goes forward if direction == 1, backward if -1
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   309
GList *hbuf_search(GList *hbuf, int direction, const char *string)
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   310
{
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   311
  hbuf_block *blk;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   312
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   313
  for (;;) {
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   314
    if (direction > 0)
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   315
      hbuf = g_list_next(hbuf);
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   316
    else
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   317
      hbuf = g_list_previous(hbuf);
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   318
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   319
    if (!hbuf) break;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   320
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   321
    blk = (hbuf_block*)(hbuf->data);
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   322
    // XXX blk->ptr is (maybe) not really correct, because the match should
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   323
    // not be after ptr_end.  We should check that...
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   324
    if (strcasestr(blk->ptr, string))
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   325
      break;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   326
  }
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   327
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   328
  return hbuf;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
   329
}
462
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
   330
464
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   331
//  hbuf_jump_date(hbuf, t)
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   332
// Return a pointer to the first line after date t in the history buffer
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   333
GList *hbuf_jump_date(GList *hbuf, time_t t)
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   334
{
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   335
  hbuf_block *blk;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   336
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   337
  hbuf = g_list_first(hbuf);
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   338
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   339
  for ( ; hbuf && g_list_next(hbuf); hbuf = g_list_next(hbuf)) {
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   340
    blk = (hbuf_block*)(hbuf->data);
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   341
    if (blk->prefix.timestamp >= t) break;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   342
  }
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   343
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   344
  return hbuf;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   345
}
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
   346
462
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
   347
//  hbuf_jump_percent(hbuf, pc)
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
   348
// Return a pointer to the line at % pc of the history buffer
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
   349
GList *hbuf_jump_percent(GList *hbuf, int pc)
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
   350
{
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
   351
  guint hlen;
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
   352
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
   353
  hbuf = g_list_first(hbuf);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
   354
  hlen = g_list_length(hbuf);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
   355
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
   356
  return g_list_nth(hbuf, pc*hlen/100);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
   357
}
576
8b3db0b555a1 Add Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 502
diff changeset
   358
580
fed6d1e4d7a9 Fix modelines
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   359
/* vim: set expandtab cindent cinoptions=>2\:2(0:  For Vim users... */