Browse code

Add pos2linecol and viceversa. Fix Cursor up/down.

Dario Rodriguez authored on 04/09/2020 17:56:20
Showing 3 changed files
... ...
@@ -1436,6 +1436,50 @@ redata_line_info(redata_t *redata, long pos, long *startpos, char **startptr, in
1436 1436
         return(0);
1437 1437
 }
1438 1438
 
1439
+int
1440
+redata_pos2linecol(redata_t *redata, long pos, int *resline, int *rescol)
1441
+{
1442
+        int line,col;
1443
+        int nchunk;
1444
+        int chunkpos;
1445
+        rechunk_t *chunk;
1446
+        int i,o;
1447
+        if(redata==NULL)
1448
+                return(-1);
1449
+        /* search chunk of pos while calculating first lineno of chunk */
1450
+        for(nchunk=0,line=0,chunkpos=0
1451
+          ;nchunk<redata->sizechunks
1452
+          ;line+=chunk->whatin.nlcount,chunkpos+=chunk->useddata,nchunk++) {
1453
+                chunk=redata->chunks[nchunk];
1454
+                if(!(chunk->whatin_fresh))
1455
+                        redata_whatin_refresh(redata,nchunk);
1456
+                if(pos<(chunkpos+chunk->useddata))
1457
+                        break;
1458
+        }
1459
+        if(nchunk>=redata->sizechunks)
1460
+                return(-1); /* pos not found */
1461
+        /* search chunk line/col */
1462
+        for(i=0,o=chunkpos,col=0;o<pos && i<chunk->useddata;i++,o++) {
1463
+                if(chunk->data[i]=='\n')
1464
+                        line++,col=0;
1465
+                else
1466
+                        col++;
1467
+        }
1468
+        if(resline!=NULL)
1469
+                *resline=line;
1470
+        if(rescol!=NULL)
1471
+                *rescol=col;
1472
+        return(0);
1473
+#warning DEBUG THIS
1474
+}
1475
+
1476
+int
1477
+redata_linecol2pos(redata_t *redata, int line, int col, long *pos)
1478
+{
1479
+#warning TODO
1480
+        return(-1);
1481
+}
1482
+
1439 1483
 static char *
1440 1484
 securesave_genname(char *filename, char *buf, int bufsize)
1441 1485
 {
... ...
@@ -144,4 +144,6 @@ int redata_generic_utf8charlen(char *ptr, int maxsize);
144 144
 
145 145
 /* line convenience funtions */
146 146
 int redata_line_info(redata_t *redata, long pos, long *startpos, char **startptr, int *len);
147
+int redata_pos2linecol(redata_t *redata, long pos, int *line, int *col);
148
+int redata_linecol2pos(redata_t *redata, int line, int col, long *pos);
147 149
 
... ...
@@ -209,7 +209,7 @@ re_processkey(re_t *re, SDL_Event *event)
209 209
         char *ptr,*ptr2;
210 210
         int len;
211 211
         int has_nl;
212
-        int oldcol;
212
+        int oldcol,maxcol;
213 213
         int linecols;
214 214
         int inc;
215 215
         if(re==NULL || event==NULL || event->type!=SDL_KEYDOWN)
... ...
@@ -219,15 +219,19 @@ re_processkey(re_t *re, SDL_Event *event)
219 219
                         return(-1); /* couldn't get current line data */
220 220
                 if(event->key.keysym.sym==SDLK_UP && newpos==0)
221 221
                         return(-1); /* going up but already at top */
222
-                oldcol=redata_generic_utf8len(ptr,re->cursorpos-newpos);
222
+                maxcol=redata_generic_utf8len(ptr,len);
223
+                if(maxcol<re->lastcol)
224
+                        re->cursorpos=newpos+len;
225
+                else
226
+                        re->cursorpos=newpos+(redata_generic_utf8col(ptr,len,re->lastcol)-ptr);
223 227
                 if(redata_line_info(re->data,(event->key.keysym.sym==SDLK_DOWN)?(newpos+len):(newpos-1),&newpos2,&ptr,&len)==-1)
224 228
                         return(-1); /* couldn't get next line data */
225 229
                 has_nl=((len>0 && ptr[len-1]=='\n')?1:0);
226
-                ptr2=redata_generic_utf8col(ptr,len-has_nl,oldcol);
227
-                if(ptr2!=NULL)
228
-                        re->cursorpos=newpos2+(ptr2-ptr);
229
-                else
230
+                maxcol=redata_generic_utf8len(ptr,len)-has_nl;
231
+                if(maxcol<re->lastcol)
230 232
                         re->cursorpos=newpos2+len-has_nl;
233
+                else
234
+                        re->cursorpos=newpos2+(redata_generic_utf8col(ptr,len,re->lastcol)-ptr);
231 235
                 if(event->key.keysym.sym==SDLK_DOWN && re->lastrow<re->maxrow)
232 236
                         re->lastrow++;
233 237
                 else if(event->key.keysym.sym==SDLK_UP && re->lastrow>0)
... ...
@@ -265,10 +269,13 @@ re_processkey(re_t *re, SDL_Event *event)
265 269
 int
266 270
 re_drawheader(re_t *re)
267 271
 {
272
+        int line,col;
268 273
         if(re==NULL)
269 274
                 return(-1);
275
+        if(redata_pos2linecol(re->data,re->cursorpos,&line,&col)==-1)
276
+                line=col=-1;
270 277
         reui_fill(re->ui,0,0,re->ui->w,re->ui->fontheight,"\x00\x00\xff\xff");
271
-        reui_printf(re->ui,0,0,"\xff\xff\x00\xff","Fichero: %s Col:%i Row:%i Pos:%li",re->filename,re->lastcol,re->lastrow,re->cursorpos);
278
+        reui_printf(re->ui,0,0,"\xff\xff\x00\xff","File: %s Line:%i (%i) Col:%i (%i) Pos:%li",re->filename,re->lastrow,line,re->lastcol,col,re->cursorpos);
272 279
         return(0);
273 280
 }
274 281