... | ... |
@@ -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 |
|