Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

TEHistory.cpp

Go to the documentation of this file.
00001 /* -------------------------------------------------------------------------- */
00002 /*                                                                            */
00003 /* [TEHistory.C]                   History Buffer                             */
00004 /*                                                                            */
00005 /* -------------------------------------------------------------------------- */
00006 /*                                                                            */
00007 /* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de>            */
00008 /*                                                                            */
00009 /* This file is part of Konsole - an X terminal for KDE                       */
00010 /*                                                                            */
00011 /* -------------------------------------------------------------------------- */
00012 /*                        */
00013 /* Ported Konsole to Qt/Embedded                                              */
00014 /*                        */
00015 /* Copyright (C) 2000 by John Ryland <jryland@trolltech.com>                  */
00016 /*                        */
00017 /* -------------------------------------------------------------------------- */
00018 
00019 #include "TEHistory.h"
00020 #include <stdlib.h>
00021 #include <assert.h>
00022 #include <stdio.h>
00023 #include <sys/types.h>
00024 #include <unistd.h>
00025 #include <errno.h>
00026 
00027 #include <qpe/config.h>
00028 
00029 #define HERE printf("%s(%d): here\n",__FILE__,__LINE__)
00030 
00031 /*
00032    An arbitrary long scroll.
00033 
00034    One can modify the scroll only by adding either cells
00035    or newlines, but access it randomly.
00036 
00037    The model is that of an arbitrary wide typewriter scroll
00038    in that the scroll is a serie of lines and each line is
00039    a serie of cells with no overwriting permitted.
00040 
00041    The implementation provides arbitrary length and numbers
00042    of cells and line/column indexed read access to the scroll
00043    at constant costs.
00044 
00045 */
00046 
00047 
00048 HistoryScroll::HistoryScroll()
00049 {
00050   m_lines = NULL;
00051   m_max_lines = 0;
00052   m_cells = NULL;
00053   m_max_cells = 0;
00054   m_num_lines = 0;
00055   m_first_line = 0;
00056   m_last_cell = 0;
00057   m_start_line = 0;
00058 }
00059 
00060 HistoryScroll::~HistoryScroll()
00061 {
00062   setSize(0,0);
00063 }
00064  
00065 void HistoryScroll::setSize(int lines, int cells) 
00066 {
00067   // could try to preserve the existing data...
00068   //  printf("setSize(%d,%d)\n", lines, cells);
00069   if (m_lines) {
00070     delete m_lines;
00071     m_lines = NULL;
00072   }
00073   if (m_cells) {
00074     delete m_cells;
00075     m_cells = NULL;
00076   }
00077   m_max_lines = m_max_cells = 0;
00078   if (lines > 0 && cells > 0) {
00079     m_max_lines = lines;
00080     m_lines = new int[m_max_lines];
00081     m_lines[0] = 0;
00082     m_max_cells = cells;
00083     m_cells = new ca[m_max_cells];
00084   }
00085   m_first_line = 0;
00086   m_num_lines = 0;
00087   m_last_cell = 0;
00088   m_start_line = 0;
00089 }
00090   
00091 void HistoryScroll::setScroll(bool on)
00092 {
00093   Config cfg( "Konsole" );
00094   cfg.setGroup("History");
00095   //  printf("setScroll(%d)\n", on);
00096   if (on) {
00097     int lines = cfg.readNumEntry("history_lines",300);
00098     int avg_line = cfg.readNumEntry("avg_line_length",60);
00099     int cells = lines * avg_line;
00100     setSize(lines,cells);
00101   } else {
00102     setSize(0,0);
00103   }
00104 }
00105  
00106 bool HistoryScroll::hasScroll()
00107 {
00108   return (m_max_lines > 0);
00109 }
00110 
00111 int HistoryScroll::getLines()
00112 {
00113   return(m_num_lines);
00114 }
00115 
00116 int HistoryScroll::getLineLen(int lineno)
00117 {
00118   if (!hasScroll()) return 0;
00119   if (lineno >= m_num_lines) {
00120     //    printf("getLineLen(%d) out of range %d\n", lineno, m_num_lines);
00121     return(0);
00122   }
00123   int len =  startOfLine(lineno+1) - startOfLine(lineno);
00124   if (len < 0) {
00125     len += m_max_cells;
00126   }
00127   //  printf("getLineLen(%d) = %d\n", lineno, len);
00128   return(len);
00129 }
00130 
00131 int HistoryScroll::startOfLine(int lineno)
00132 {
00133   //  printf("startOfLine(%d) =", lineno);
00134   if (!hasScroll()) return 0;
00135   assert(lineno >= 0 && lineno <= m_num_lines);
00136   if (lineno < m_num_lines) {
00137     int index = lineno + m_first_line;
00138     if (index >= m_max_lines)
00139       index -= m_max_lines;
00140     //    printf("%d\n", m_lines[index]);
00141     return(m_lines[index]);
00142   } else {
00143     //    printf("last %d\n", m_last_cell);
00144     return(m_last_cell);
00145   }
00146 }
00147 
00148 void HistoryScroll::getCells(int lineno, int colno, int count, ca *res)
00149 {
00150   //  printf("getCells(%d,%d,%d) num_lines=%d\n", lineno, colno, count, m_num_lines);
00151   assert(hasScroll());
00152   assert(lineno >= 0 && lineno < m_num_lines);
00153   int index = lineno + m_first_line;
00154   if (index >= m_max_lines)
00155     index -= m_max_lines;
00156   assert(index >= 0 && index < m_max_lines);
00157   index = m_lines[index] + colno;
00158   assert(index >= 0 && index < m_max_cells);
00159   while(count-- > 0) {
00160     *res++ = m_cells[index];
00161     if (++index >= m_max_cells) {
00162       index = 0;
00163     }
00164   }
00165 }
00166 
00167 void HistoryScroll::addCells(ca *text, int count)
00168 {
00169   if (!hasScroll()) return;
00170   int start_cell = m_last_cell;
00171   //  printf("addCells count=%d start=%d first_line=%d first_cell=%d lines=%d\n", 
00172   //     count, start_cell, m_first_line, m_lines[m_first_line], m_num_lines);
00173   if (count <= 0) {
00174     return;
00175   }
00176   while(count-- > 0) {
00177     assert (m_last_cell >= 0 && m_last_cell < m_max_cells );
00178     m_cells[m_last_cell] = *text++;
00179     if (++m_last_cell >= m_max_cells) {
00180       m_last_cell = 0;
00181     }
00182   }
00183   if (m_num_lines > 1) {
00184     if (m_last_cell > start_cell) {
00185       while(m_num_lines > 0
00186             && m_lines[m_first_line] >= start_cell 
00187             && m_lines[m_first_line] < m_last_cell) {
00188         //              printf("A remove %d>%d && %d<%d first_line=%d num_lines=%d\n", 
00189         //                     m_lines[m_first_line], start_cell, m_lines[m_first_line], m_last_cell,
00190         //                     m_first_line, m_num_lines);
00191         if (++m_first_line >= m_max_lines) {
00192           m_first_line = 0;
00193         }
00194         m_num_lines--;
00195       }
00196     } else {
00197       while(m_num_lines > 0
00198             && (m_lines[m_first_line] >= start_cell 
00199                 || m_lines[m_first_line] < m_last_cell)) {
00200         //              printf("B remove %d>%d || %d<%d first_line=%d num_lines=%d\n", 
00201         //                     m_lines[m_first_line], start_cell, m_lines[m_first_line], m_last_cell,
00202         //       m_first_line, m_num_lines);
00203         if (++m_first_line >= m_max_lines) {
00204           m_first_line = 0;
00205         }
00206         m_num_lines--;
00207       }
00208     }
00209   }
00210 }
00211 
00212 void HistoryScroll::addLine()
00213 {
00214   if (!hasScroll()) return;
00215   int index = m_first_line + m_num_lines;
00216   if (index >= m_max_lines) {
00217     index -= m_max_lines;
00218   }
00219   //  printf("addLine line=%d cell=%d\n", index, m_last_cell);
00220   assert(index >= 0 && index < m_max_lines);
00221   m_lines[index] = m_start_line;
00222   m_start_line = m_last_cell;
00223   if (m_num_lines >= m_max_lines) {
00224     if (++m_first_line >= m_num_lines) {
00225       m_first_line = 0;
00226     }
00227   } else {
00228     m_num_lines++;
00229   }
00230 }

Generated on Sat Nov 5 16:15:27 2005 for OPIE by  doxygen 1.4.2