home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / ftes46b5.zip / ftes46b5 / src / e_mark.cpp < prev    next >
C/C++ Source or Header  |  1998-01-26  |  6KB  |  258 lines

  1. #include "fte.h"
  2.  
  3. EMarkIndex markIndex;
  4.  
  5. EMark::EMark(char *aName, char *aFileName, EPoint aPoint, EBuffer *aBuffer) {
  6.     Name = new char[strlen(aName) + 1];
  7.     FileName = new char[strlen(aFileName) + 1];
  8.     Buffer = 0;
  9.     Point = aPoint;
  10.     assert(Name != 0);
  11.     assert(FileName != 0);
  12.     strcpy(Name, aName);
  13.     strcpy(FileName, aFileName);
  14.     if (aBuffer == 0)
  15.         aBuffer = FindFile(aFileName);
  16.     if (aBuffer && aBuffer->Loaded)
  17.         setBuffer(aBuffer);
  18.     else
  19.         aBuffer = 0;
  20. }
  21.  
  22. EMark::~EMark() {
  23.     if (Buffer)
  24.         removeBuffer(Buffer);
  25.     delete Name;
  26.     delete FileName;
  27. }
  28.  
  29. int EMark::setBuffer(EBuffer *aBuffer) {
  30.     assert(aBuffer != 0);
  31.     assert(filecmp(aBuffer->FileName, FileName) == 0);
  32.  
  33.     if (Point.Row >= aBuffer->RCount)
  34.         Point.Row = aBuffer->RCount - 1;
  35.     if (Point.Row < 0)
  36.         Point.Row = 0;
  37.  
  38.     if (aBuffer->PlaceBookmark(Name, Point) == 1) {
  39.         Buffer = aBuffer;
  40.         return 1;
  41.     }
  42.     return 0;
  43. }
  44.  
  45. int EMark::removeBuffer(EBuffer *aBuffer) {
  46.     assert(aBuffer != 0);
  47.     if (Buffer == 0 || Buffer != aBuffer)
  48.         return 0;
  49.     assert(filecmp(aBuffer->FileName, FileName) == 0);
  50.  
  51.     if (Buffer->GetBookmark(Name, Point) == 0)
  52.         return 0;
  53.     if (Buffer->RemoveBookmark(Name) == 0)
  54.         return 0;
  55.     
  56.     Buffer = 0;
  57.     return 1;
  58. }
  59.  
  60. EPoint &EMark::getPoint() {
  61.     if (Buffer) {
  62.         assert(Buffer->GetBookmark(Name, Point) != 0);
  63.     }
  64.     return Point;
  65. }
  66.  
  67. EMarkIndex::EMarkIndex() {
  68.     markCount = 0;
  69.     marks = 0;
  70. }
  71.  
  72. EMarkIndex::~EMarkIndex() {
  73.     if (markCount > 0) {
  74.         for (int n = 0; n < markCount; n++)
  75.             delete marks[n];
  76.         delete marks;
  77.     }
  78. }
  79.  
  80. EMark *EMarkIndex::insert(char *aName, char *aFileName, EPoint aPoint, EBuffer *aBuffer) {
  81.     int L = 0, R = markCount, M, cmp;
  82.  
  83.     assert(aName != 0 && aName[0] != 0);
  84.     assert(aFileName != 0 && aFileName[0] != 0);
  85.  
  86.     while (L < R) {
  87.         M = (L + R) / 2;
  88.         cmp = strcmp(aName, marks[M]->getName());
  89.         if (cmp == 0)
  90.             return 0;
  91.         else if (cmp > 0)
  92.             L = M + 1;
  93.         else
  94.             R = M;
  95.     }
  96.  
  97.     EMark **newMarks = (EMark **)realloc(marks,
  98.                                          sizeof(marks[0]) * (markCount + 1));
  99.     if (newMarks == 0)
  100.         return 0;
  101.     marks = newMarks;
  102.  
  103.     EMark *m = new EMark(aName, aFileName, aPoint, aBuffer);
  104.     if (m == 0)
  105.         return 0;
  106.  
  107.     memmove(marks + L + 1, marks + L, sizeof(marks[0]) * (markCount - L));
  108.     markCount++;
  109.     marks[L] = m;
  110.     return m;
  111. }
  112.  
  113. EMark *EMarkIndex::insert(char *aName, EBuffer *aBuffer, EPoint aPoint) {
  114.     assert(aName != 0 && aName[0] != 0);
  115.     assert(aBuffer != 0);
  116.     assert(aBuffer->FileName != 0);
  117.  
  118.     return insert(aName, aBuffer->FileName, aPoint, aBuffer);
  119. }
  120.  
  121. EMark *EMarkIndex::locate(char *aName) {
  122.     int L = 0, R = markCount, M, cmp;
  123.  
  124.     assert(aName != 0 && aName[0] != 0);
  125.  
  126.     while (L < R) {
  127.         M = (L + R) / 2;
  128.         cmp = strcmp(aName, marks[M]->getName());
  129.         if (cmp == 0)
  130.             return marks[M];
  131.         else if (cmp > 0)
  132.             L = M + 1;
  133.         else
  134.             R = M;
  135.     }
  136.     return 0;
  137. }
  138.  
  139. int EMarkIndex::remove(char *aName) {
  140.     int L = 0, R = markCount, M, cmp;
  141.  
  142.     assert(aName != 0 && aName[0] != 0);
  143.  
  144.     while (L < R) {
  145.         M = (L + R) / 2;
  146.         cmp = strcmp(aName, marks[M]->getName());
  147.         if (cmp == 0) {
  148.             EMark *m = marks[M];
  149.             
  150.             memmove(marks + M,
  151.                     marks + M + 1,
  152.                     sizeof(marks[0]) * (markCount - M - 1));
  153.             markCount--;
  154.  
  155.             EMark **newMarks = (EMark **)realloc(marks,
  156.                                                sizeof(marks[0]) * (markCount));
  157.             if (newMarks != 0)
  158.                 marks = newMarks;
  159.  
  160.             delete m;
  161.             return 1;
  162.         } else if (cmp > 0)
  163.             L = M + 1;
  164.         else
  165.             R = M;
  166.     }
  167.     return 0;
  168. }
  169.  
  170. int EMarkIndex::view(EView *aView, char *aName) {
  171.     EMark *m = locate(aName);
  172.     if (m) {
  173.         EBuffer *b = m->getBuffer();
  174.         if (b == 0) {
  175.             if (FileLoad(0, m->getFileName(), 0, aView) == 0)
  176.                 return 0;
  177.             if (retrieveForBuffer((EBuffer *)ActiveModel) == 0)
  178.                 return 0;
  179.             b = (EBuffer *)ActiveModel;
  180.         }
  181.         aView->SwitchToModel(b);
  182.         return b->GotoBookmark(m->getName());
  183.     }
  184.     return 0;
  185. }
  186.  
  187. int EMarkIndex::retrieveForBuffer(EBuffer *aBuffer) {
  188.     for (int n = 0; n < markCount; n++)
  189.         if (marks[n]->getBuffer() == 0 &&
  190.             filecmp(aBuffer->FileName, marks[n]->getFileName()) == 0)
  191.         {
  192.             if (marks[n]->setBuffer(aBuffer) == 0)
  193.                 return 0;
  194.         }
  195.     return 1;
  196. }
  197.  
  198. int EMarkIndex::storeForBuffer(EBuffer *aBuffer) {
  199.     for (int n = 0; n < markCount; n++)
  200.         if (marks[n]->getBuffer() == aBuffer)
  201.             if (marks[n]->removeBuffer(aBuffer) == 0)
  202.                 return 0;
  203.     return 1;
  204. }
  205.  
  206. int EMarkIndex::saveToDesktop(FILE *fp) {
  207.     for (int n = 0; n < markCount; n++) {
  208.         EPoint p = marks[n]->getPoint();
  209.  
  210.         // ??? file of buffer or of mark? (different if file renamed) ???
  211.         // perhaps marks should be duplicated?
  212.         fprintf(fp, "M|%d|%d|%s|%s\n",
  213.                 p.Row, p.Col,
  214.                 marks[n]->getName(),
  215.                 marks[n]->getFileName());
  216.     }
  217.     return 1;
  218. }
  219.  
  220. // needs performance fixes (perhaps a redesign ?)
  221.  
  222. EMark *EMarkIndex::pushMark(EBuffer *aBuffer, EPoint P) {
  223.     int stackTop = -1;
  224.     
  225.     for (int n = 0; n < markCount; n++) {
  226.         char *name = marks[n]->getName();
  227.         if (name && name[0] == '#' && isdigit(name[1])) {
  228.             int no = atoi(name + 1);
  229.             if (no > stackTop)
  230.                 stackTop = no;
  231.         }
  232.     }
  233.     char name[20];
  234.     sprintf(name, "#%d", stackTop + 1);
  235.     return insert(name, aBuffer, P);
  236. }
  237.  
  238. int EMarkIndex::popMark(EView *aView) {
  239.     int stackTop = -1;
  240.     
  241.     for (int n = 0; n < markCount; n++) {
  242.         char *name = marks[n]->getName();
  243.         if (name && name[0] == '#' && isdigit(name[1])) {
  244.             int no = atoi(name + 1);
  245.             if (no > stackTop)
  246.                 stackTop = no;
  247.         }
  248.     }
  249.     if (stackTop == -1)
  250.         return 0;
  251.     char name[20];
  252.     sprintf(name, "#%d", stackTop);
  253.     if (view(aView, name) == 0)
  254.         return 0;
  255.     assert(remove(name) == 1);
  256.     return 1;
  257. }
  258.