From 31925e4517a85f316617d220776af2fd179ce02a Mon Sep 17 00:00:00 2001
From: Chris Allegretta <chrisa@asty.org>
Date: Thu, 2 Nov 2000 04:40:39 +0000
Subject: [PATCH] Allow variable length strings on statusbar

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@257 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 ChangeLog       |   9 +++++
 global.c        |   2 +-
 po/cat-id-tbl.c |  91 +++++++++++++++++++++++++-----------------------
 po/es.gmo       | Bin 17459 -> 17372 bytes
 po/nano.pot     |  81 ++++++++++++++++++++++++------------------
 proto.h         |   3 +-
 search.c        |  42 ++++++++++++++++------
 utils.c         |  17 +++++++++
 winio.c         |  54 ++++++++++++++++------------
 9 files changed, 186 insertions(+), 113 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 43ba6c16..9c8d3e67 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,15 @@ CVS Code -
   replace with the null string without needing a special key for it.  
   changed code in search_init(), do_replace(), nanogetstr (see below).
 - Added some missing gettext calls here and there (Jordi).
+- Revamped nanogetsr() and calls to it to use variable length strings.
+  MANY changes in nanogetstr(), many chances in search.c, new function
+  mallocstrcpy which is sure to be a programmatic nightmare, changed
+  last_search, last_replace, answer to pointers.  New function
+  not_found_msg in search.c for displaying truncated strings in satusbar
+  when the string is not found.
+
+  *** Note that backspace key makes input be off by one when entring
+  *** a string > COLS in length.  This must be fixed before a new release
 
 - global.c
 	- New global replace_list_2, for 2nd half of the replace dialog
diff --git a/global.c b/global.c
index 981ec50f..115385d5 100644
--- a/global.c
+++ b/global.c
@@ -54,7 +54,7 @@ filestruct *editbot = NULL;	/* Same for the bottom */
 filestruct *filebot = NULL;	/* Last node in the file struct */
 filestruct *cutbuffer = NULL;	/* A place to store cut text */
 
-char answer[132];		/* Answer str to many questions */
+char *answer = NULL;			/* Answer str to many questions */
 int totlines = 0;		/* Total number of lines in the file */
 int totsize = 0;		/* Total number of bytes in the file */
 int placewewant = 0;		/* The collum we'd like the cursor
diff --git a/po/cat-id-tbl.c b/po/cat-id-tbl.c
index 97f5456a..90723160 100644
--- a/po/cat-id-tbl.c
+++ b/po/cat-id-tbl.c
@@ -186,49 +186,52 @@ Usage: nano [option] +LINE <file>\n\
   {"Cannot move edit win", 153},
   {"Cannot resize bottom win", 154},
   {"Cannot move bottom win", 155},
-  {"%s enable/disable", 156},
-  {"enabled", 157},
-  {"disabled", 158},
-  {"Main: set up windows\n", 159},
-  {"Main: bottom win\n", 160},
-  {"Main: open file\n", 161},
-  {"I got Alt-O-%c! (%d)\n", 162},
-  {"I got Alt-[-1-%c! (%d)\n", 163},
-  {"I got Alt-[-2-%c! (%d)\n", 164},
-  {"I got Alt-[-%c! (%d)\n", 165},
-  {"I got Alt-%c! (%d)\n", 166},
-  {"Case Sensitive Regexp Search%s%s", 167},
-  {"Regexp Search%s%s", 168},
-  {"Case Sensitive Search%s%s", 169},
-  {"Search%s%s", 170},
-  {" (to replace)", 171},
-  {"Search Cancelled", 172},
-  {"Search Wrapped", 173},
-  {"Replaced %d occurences", 174},
-  {"Replaced 1 occurence", 175},
-  {"Replace Cancelled", 176},
-  {"Replace with", 177},
-  {"Replace this instance?", 178},
-  {"Enter line number", 179},
-  {"Aborted", 180},
-  {"Come on, be reasonable", 181},
-  {"Only %d lines available, skipping to last line", 182},
-  {"actual_x_from_start for xplus=%d returned %d\n", 183},
-  {"input '%c' (%d)\n", 184},
-  {"New Buffer", 185},
-  {"  File: ...", 186},
-  {"Modified", 187},
-  {"Moved to (%d, %d) in edit buffer\n", 188},
-  {"current->data = \"%s\"\n", 189},
-  {"I got \"%s\"\n", 190},
-  {"Yes", 191},
-  {"All", 192},
-  {"No", 193},
-  {"do_cursorpos: linepct = %f, bytepct = %f\n", 194},
-  {"line %d of %d (%.0f%%), character %d of %d (%.0f%%)", 195},
-  {"Dumping file buffer to stderr...\n", 196},
-  {"Dumping cutbuffer to stderr...\n", 197},
-  {"Dumping a buffer to stderr...\n", 198},
+  {"Justify Complete", 156},
+  {"%s enable/disable", 157},
+  {"enabled", 158},
+  {"disabled", 159},
+  {"Main: set up windows\n", 160},
+  {"Main: bottom win\n", 161},
+  {"Main: open file\n", 162},
+  {"I got Alt-O-%c! (%d)\n", 163},
+  {"I got Alt-[-1-%c! (%d)\n", 164},
+  {"I got Alt-[-2-%c! (%d)\n", 165},
+  {"I got Alt-[-%c! (%d)\n", 166},
+  {"I got Alt-%c! (%d)\n", 167},
+  {"Case Sensitive Regexp Search%s%s", 168},
+  {"Regexp Search%s%s", 169},
+  {"Case Sensitive Search%s%s", 170},
+  {"Search%s%s", 171},
+  {" (to replace)", 172},
+  {"Search Cancelled", 173},
+  {"\"%s...\" not found", 174},
+  {"Search Wrapped", 175},
+  {"Replaced %d occurences", 176},
+  {"Replaced 1 occurence", 177},
+  {"Replace Cancelled", 178},
+  {"Replace with", 179},
+  {"Replace this instance?", 180},
+  {"Replace failed: unknown subexpression!", 181},
+  {"Enter line number", 182},
+  {"Aborted", 183},
+  {"Come on, be reasonable", 184},
+  {"Only %d lines available, skipping to last line", 185},
+  {"actual_x_from_start for xplus=%d returned %d\n", 186},
+  {"input '%c' (%d)\n", 187},
+  {"New Buffer", 188},
+  {"  File: ...", 189},
+  {"Modified", 190},
+  {"Moved to (%d, %d) in edit buffer\n", 191},
+  {"current->data = \"%s\"\n", 192},
+  {"I got \"%s\"\n", 193},
+  {"Yes", 194},
+  {"All", 195},
+  {"No", 196},
+  {"do_cursorpos: linepct = %f, bytepct = %f\n", 197},
+  {"line %d of %d (%.0f%%), character %d of %d (%.0f%%)", 198},
+  {"Dumping file buffer to stderr...\n", 199},
+  {"Dumping cutbuffer to stderr...\n", 200},
+  {"Dumping a buffer to stderr...\n", 201},
 };
 
-int _msg_tbl_length = 198;
+int _msg_tbl_length = 201;
diff --git a/po/es.gmo b/po/es.gmo
index 25441f656147ff9502c12e3ebf3cb9d1eb6bbe1b..0d279a02a307dd013ac277558ac77feb00966b13 100644
GIT binary patch
delta 4469
zcmYM$4OG?T0mt#@@}hzq-_bykYg_{a<X*jCpuC7qrnsp=u7s?sT<t1w5yaQFyV^3;
zk}WjRGG&`-W@C1zt#rDnwbU$I%Tw02wzktbow=86ws6aRfA>CY|HJQop6B6z|Ige1
z|A%n9<AX;Wq2CRQ+hI7)k}+gjKV$kkjHydft1;__7?Y0caUkx(MBI<#F^sq3dpHUI
zjaisK)EE!mg)ZEJUhKha{1dv337J8|jJb`5G8~7?@D^;x$=HqR=pEDrZeT9DhZ|Fb
z_h26G#58;b`7s~yF$q6MbvR*!F*C6Sb)8*UNdM*y3K~Fsa`X$isQSIAjyIuJ=CEx)
zXX}5*OxhDiMmsJ*C-rLNS7tSq;1+x=)|l6D3iXAl#tg!3IF$a)9t!=j2Q~5+k@L+3
z)RMo63HUz7;h$~&6C6eTGi29H(r9D&F~j-L`T0nnrU;p%nUA`@AGN~kF{Be7r=Sr(
zi~8azbmBQo!B0@<#jy<f;%HRei(1+$)Ol@~fgPx=4BPrUIDz^XsFiiGPnvL58tXrR
zLNyKAt2)%p)q$GPZk&kSsI9n!T7m007H^<#&QvPuuo$&+br_HLA@`YChMa2Fp}zkF
zY73qm%ld0ZhiKrwGG|cr%cvRs4Ov~2Krb4Y3pMh5)WD~p6U&hw<Ksgs_#m=qW~;3q
zKy`cswWY^UTX8x>K}&xb^YJgJr5)ppK1P#Kdsm0L*;b(junRS#Zq$HJp*nsSHRC@b
zPont@b^UmjrvOKz2EG7werOQ|&8!~v+y?ClUADa&b(8g=R_Ir#6}f`i`+uVLJe`+-
z&YOXnc`a%HYmrk-JF1^Ur~w>B1`skQDa6q58tQ}#s6D@onqfRw*M%}rzxSd>USaEV
zZG92yomG!op;gF_S<i=7WDjb|dr-eW6KN08AqCx)zeTp&#JQqdkb$~jv8`94wqh}s
zU@K~1M^HD@Y1B;LLJjm9I`K<Xhw0qGv6zWkfgDVrf8(W~8JD6~q7k)M&B&O{GpH||
zM-A|8TmKZ*@eNdmiOfPBB%|JlDX8mKqPBJo>R#B3y19>HNEd#Sg7)%V)JS78qZdv@
z%_s%AFU?fcjB9Z+HlRA%hglBZq^R>gr#G$KC@wk}U8wWCn1f4DE4VG2{nv$Fr$Op1
z!5EAe`7yP8cySY!;&EH=MOM}1b2Z&;H8>TUQ5_w|BD{hg9Kj!q={O6uvhC=^lew(F
z9=G4qpcAj7mMV*@RNw;Cg|?$c{04H0Nn%}fp(51zLDcuVZ2dekCvy$8B56F^db~^c
zV7E*oYNDMX3Yx*oSdN#me;iBaj&_{R^!3=?joPyY)Rt{R?PUkX<9<xU=P(IhvhA;8
zKkBa|50rTu_5JIp$2fG8LIQ<UrlXO$kZm+`Y`q0J#dKjIUbOW%D*dS!A!9bvQ8QYF
zBe4th`1W8jUPN90Bh*9^_*2Nu9WogdG_p!$Tg?j8UhY6G?OUjhdQk(7xjp)~A_?_0
zl%Zy{7_~LaQ8(>&)XE$~ZNUjtKOdkbcoSpk-(<4EIxz<|G7oC+s%(23YH2s3X0#dk
zLuL-3E_fC-kdILv_bZN`pM@G&A!^`dsNc^<C$7Xq`ZteK&~v_14R{>2XRqQwyoh>p
zy@y)LtH>&vSeEG)EJh8a+Sb<~yJR|0*Lwvu;7h3UuA=UdA=6m@Q54cBjKBiaOy;0E
z2%uh_`%p7@0d>I>$b(?c+xovyH)$-7h?aUJYNZNM9oC?hd@X9Cdoc~ql(7C|DExs2
zb^Il2>C;N1BdkPqScAF;mS7C7u<ebgJ>Q7x=pbq$7f>&%4^dn24_og=O=MtM^u?51
z#`>#aJPjI1K59kgqL#WIHGmDM3qOoJ(q=bm2InvpKgK~AQyzVshoZJ74`<>m)Cz4y
zUFT_3f8h`Xb#MvC;`^up^`hS8anqx}AAp+4aMWWo26c~AAUCp^ZQCER?FUgS(t}#L
zU!w+a1-18AQ7akhrJx!8$C_Iaee7ycEAU+$jk{3;J%-tM*4F=un)w%~fen}ueGg1T
zb$BQ0)qX#+NaiVYpbm<mNa1UIYE(POl1K|3qn2(G`5w_AbZGgGkr<+HGw#T7oX^ul
zH>L)-foKb!BYVhl@*@%;JV23u$F}JTBdO@krP01fbSxlQL~k}7kCD}+ldK~@AiD8%
zw32;9kDQJzq?w!{Ddd|(N0?NTI<k{!Tint4vwu{6NcxUt6oR%g0e2DIAE#`a*lx=k
zG2NEGZ57WDZJCZm<WBN1d6w|5iX4&tk5YWZHi)0u@(T2l1hUGuJ#DSP!(_0ni+Wqu
zld+HtC!5G#(sw*gLHCOeo`8@!LE$91i)<#bWH<Rf`32Fjn7GJK$XVhiI;zM|$^9gQ
zj3eFT>*T9M$I2+?N&GR<3vDSmNM6wXJ1OWjJBO?xI_8t7BBkilq2gD_G?J={J?`l%
zV681bh%b?Oq=no{n#j+|exl<J^1KRK|Ch;RGM5}8eaBi`D8bwN8c{E(A-3+rE^?o(
zm*Q0N9nwb1$yTDHoqQuwGUg#XLL&R`q0o=ykRDP<`i^@kB$Fv*0Es6LkTTLpzD0EO
z-DoOTk_K{s%p$)eHRNvc1nE1*>*0Hp+Irj4Va*IbKg2gIJSt<bW9%|tput~X>}+dV
z*%Vyc<ZNwQ;$PR?;%{vY1e?Znrn#!Z8(a@K!h>#0i-|AFnX$0CGdC->z?0|pI6YH}
z3*0$wkK3I%e_q}l{xt!8DQ~84wZGUo$?bOMdH#1^0q1pY%vzA(Z!K>KOboUx@BA>U
zFgDN{>`cjag-f$HCx?Gin(ml5%h%8lbo!f|Eq;GvbAxY#uci3^qY7MWa@PA>mj;`H
YO9S=3ah;!*%?{5i-{}b7obHYJFG@Mt{{R30

delta 4541
zcmZA3e^6Cr9>?+Lf&w9ffXOcbPdCu3a`OTg5fu?cw!{SmO)D+0Ku97Optf3F6HSe*
z*6YvBU;D##D>Id{v^3LQ9rurRwVYYkvR}+PJ65}{Gr7A>+rB^d9A_M#;d5W-91iDs
zp6~OVtDmfK^{jOTFDLccWN4>J2AL9NOsvb8C*yS0m;(vM490`l56@vNeu_DG72TMa
zXiPr((SuExhc96^o<u)h!C{z@WQ@<4psD0w2p5*(UAPld@dOs&MN~(z1MCMBU@qtL
zu^2a@7ypEr_yh7|2Hj~7Xe6q`d02tZqaV-VDEc>11MLBnU_QTSaL%`&IzEo7Os{j@
zm297Ta46R&p*miO7Iq`IntfP;Cvklw2PwuB!3*ie#N%m9q<?dPgJ`^h8u>p^_eT!0
zOCF7Pa6SP0V5W2KMxJSMkySGl$d9SwL-#i!eVfOT$(psO=kGvO_#g&#!yh@&h`&Jn
z;SIFV#kAAVjk<3f>JRIj^A=QTyHNMNj(6i3)KXq`&SNRhaL)5kOFbJk;jT>TAHzX6
z7gYL<sLgc-HKX%*4_-tqMNF1mfqRf2Q^1EdXDzD3c2wmyVqe^f>^HL$d4xHDs^EvH
zCHN?d`fEmCa)EtjzDJ$M^Hj}fD6$%+3^lOXsF63J2Hu7iK7st0ZG5PLN01_#Q_lHk
zsE+@RdW*hAEyaI>9H{j1mN6qS8&&G*sMlx#YV9_nHrp$x0h~k4=pt&sH&7iXPzKF7
z9eFcNF6#LuScr9~fv-c|AKbu!X0{#G;a=y4KReeiqBhwTRE2&-RV0a*UTg0~t@%vU
zealfZ51|I|2J$E71gf7eQ3Ln}89>l{$3X-a^c39?iMk;kwe~5fnO346*nqlkF=_@~
z&iQ)h{AJX4*B(@*4k170C?BfKWmM_^iP3uh`()d{h(ng&WTBRz1ofcl&hG=x^$ygM
zJclK?3pKD$QJd;p)Qo>X4RkO&*TUhb0aaln)?p0&o0%MFCUa3UehgKSZKyTdjtthE
zN0s<H3|EMENdrznosU8dpcK_{HL9ZrP~VVqP|xp14<5y!Hpf>SXt)0d^`HUlG_7q0
zYQ&YO2UnwJHV4_aCWxB(E-b(UsE&Hk=VFi0i|(7q!&J$7?2n63_pKO4{YP-Hp9?DG
zUr`TA9d0`X8IxIo{FuFb`0+fB$7udo=aopc&2rS{+l^!KJyb{k#$p`8KOA{D7t3%%
zF7;Q5KjwmkvD~e-AA!2D9961LEXN(F2Yrqja60wmPt7dUb5^77e;4)lz0P?u?>2KY
zrKpNDBR^(ckWZG=96`<WGt>;Ce8x;bH%9lNbf}IOFkQWddr(XE4r<BHqn7d#_Qh)$
zi#IS1`!YIRPr@inMK=ZqbD#&5qu%Q(yaOLa4QvszoMy9gejItG>BUi)#)r<QVl=Ks
z&1^ktLdP%}dr`0P_c##Kio(winvoo6CNogGybU$75Ngd2qt@~ZRB1CuJDU<U&}!7b
z9kWnxLpN$ducDTw2eoNGM^zw#GHMB8(5?61!+~a4g?e2&P&Y2cG<*uRc3Yh5AD~Km
z1~sD#$Uk)EI%?nvW9)$xpgOKa-QS5C*h<vEyY+keH=8)H@NLwMe?e8^E9X3#>1)lB
zupg$OzQJ-(r7T9OYHBbQpG6I1mvep+SuJx3_58$f_JA`ms2htp&?cFUDcFp6;xnj{
zZbo(R7V0bXYt#(>hk9TPuL3WGNk*Mlpf+g@s?_r^6IY`8+l{LDsS@h1nO=2n=+8@?
z!MPXJ@nlr#n^6M{p*q-&+HCtV0uMXakD%^5gIfEKQ60KU?FnV0zOaf>OEI}LXkVz~
zf@ai!{jt?Ke;PHQwW!MML6!U%Y9Jq>Ds>q(!|Rxii4*K^%v{t`jm1G&gIb~mSb?j8
z9H>-hQ4jhA)!{W%2k~WgCDKp>9F5wf<*46RqGmD;^}0TY+AAxN4R6*s*H552{+sjr
zA5oPFMwQ#89EKW59;$>D7=hD}FEKOSu?sz%A3{~)5^84GPy>pcXfN3y)cGWg$Em0R
zK7#sQSdH`-H2XLx;KKVz^~`m2;W09t)DX4z$SI;K>?CiI*U28DrZTHTHNGm$8{s3q
zS#dIXh18SB$*V+do8EtQdN0w2xsT+NSwxLj+H5565UuNrMC-PftRZUZ^e*x!*+6bK
zRpn(ejA-wuy=@czJizDA=|5bagZLUbO{k=qPJT=F6N~6RZOj>@mUNP3<o33k3tE=I
zZNIqtmUI3&2{*k#LB3<cuf!tznpuat$YRn)9wutqoQ-5FnL~a?rjSCS<|ls$AKCBx
zQjUK`mN?h+{jkzG7TQBJ&5Q5o@F#l!Pmo`b`^l{>$~k!+8^}+{YBGedWy~|=A@Tsx
zhW!ocCRwD4j3mD&tB9KRT)6*9@HCl8){@a=A5kkKJIG-&mV7{NZO=L<n^3Rq&DP-@
zG~;~o2suQuiCPKaUvx81^RFXnTgVEsoTxoVMvz|;{b%Ahx!IoNU;(KlU8IQ|C2F%t
zQuxUJ2h2GP^B|uQq?)vnU<)5=zavkP$4Dl5fs7~HiCQWdM{-CqQQJ(O2p`!WQ=Q|N
za6K97oX6op@@w)gag)B}q{cCggWFpq7v3au$pq3))Iy{mi6MzZ?WZ>3&rv;#69P#w
z)r(tNth&zjo(t{-S12yKJl0y;+&SNRD5qmiPi6KhSIUfzMyqpvqt&WAJ38B&Tbpt%
zx4Y+TPF94gDD?Hv^g^FEzsU0Cjqw+HeSV)Wc502cwsA>wM{`@Nw<6HlIL6BN`Fvhq
zvDa5*<>imb^N;Z5hsJuQg&y`Khqie9k@wZrgg*3SySzRB@~j&eH!;xA*cz~w1nR#D
z^eh{1xk6`4?;TLv*tl>}OJG@`-KuYEwTGB6VXG^3MhBN#0#^Mke-<9&-m=1o{{yr!
B*rNad

diff --git a/po/nano.pot b/po/nano.pot
index 01579470..16358e6b 100644
--- a/po/nano.pot
+++ b/po/nano.pot
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2000-10-31 00:32-0500\n"
+"POT-Creation-Date: 2000-11-01 23:34-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -32,7 +32,7 @@ msgstr ""
 msgid "Read %d lines"
 msgstr ""
 
-#: files.c:217 search.c:161 search.c:196
+#: files.c:217 search.c:148
 #, c-format
 msgid "\"%s\" not found"
 msgstr ""
@@ -380,7 +380,7 @@ msgid "Case Sens"
 msgstr ""
 
 #: global.c:344 global.c:364 global.c:375 global.c:385 global.c:401
-#: global.c:405 global.c:411 winio.c:974
+#: global.c:405 global.c:411 winio.c:982
 msgid "Cancel"
 msgstr ""
 
@@ -675,6 +675,10 @@ msgstr ""
 msgid "Cannot move bottom win"
 msgstr ""
 
+#: nano.c:1567
+msgid "Justify Complete"
+msgstr ""
+
 #: nano.c:1635
 #, c-format
 msgid "%s enable/disable"
@@ -725,73 +729,82 @@ msgstr ""
 msgid "I got Alt-%c! (%d)\n"
 msgstr ""
 
-#: search.c:79
+#: search.c:88
 #, c-format
 msgid "Case Sensitive Regexp Search%s%s"
 msgstr ""
 
-#: search.c:81
+#: search.c:90
 #, c-format
 msgid "Regexp Search%s%s"
 msgstr ""
 
-#: search.c:83
+#: search.c:92
 #, c-format
 msgid "Case Sensitive Search%s%s"
 msgstr ""
 
-#: search.c:85
+#: search.c:94
 #, c-format
 msgid "Search%s%s"
 msgstr ""
 
-#: search.c:88
+#: search.c:97
 msgid " (to replace)"
 msgstr ""
 
-#: search.c:96
+#: search.c:105 search.c:274
 msgid "Search Cancelled"
 msgstr ""
 
-#: search.c:177
+#: search.c:152
+#, c-format
+msgid "\"%s...\" not found"
+msgstr ""
+
+#: search.c:199
 msgid "Search Wrapped"
 msgstr ""
 
-#: search.c:266
+#: search.c:288
 #, c-format
 msgid "Replaced %d occurences"
 msgstr ""
 
-#: search.c:268
+#: search.c:290
 msgid "Replaced 1 occurence"
 msgstr ""
 
-#: search.c:404 search.c:420 search.c:442
+#: search.c:426 search.c:442 search.c:464
 msgid "Replace Cancelled"
 msgstr ""
 
-#: search.c:436
+#: search.c:458
 msgid "Replace with"
 msgstr ""
 
-#: search.c:473
+#: search.c:495
 msgid "Replace this instance?"
 msgstr ""
 
+#: search.c:503
+msgid "Replace failed: unknown subexpression!"
+msgstr ""
+
 #. Ask for it
-#: search.c:534
+#: search.c:556
 msgid "Enter line number"
 msgstr ""
 
-#: search.c:536
+#: search.c:558
 msgid "Aborted"
 msgstr ""
 
-#: search.c:556
+#: search.c:578
 msgid "Come on, be reasonable"
 msgstr ""
 
-#: search.c:561
+#: search.c:583
 #, c-format
 msgid "Only %d lines available, skipping to last line"
 msgstr ""
@@ -801,67 +814,67 @@ msgstr ""
 msgid "actual_x_from_start for xplus=%d returned %d\n"
 msgstr ""
 
-#: winio.c:390
+#: winio.c:398
 #, c-format
 msgid "input '%c' (%d)\n"
 msgstr ""
 
-#: winio.c:427
+#: winio.c:435
 msgid "New Buffer"
 msgstr ""
 
-#: winio.c:430
+#: winio.c:438
 msgid "  File: ..."
 msgstr ""
 
-#: winio.c:438
+#: winio.c:446
 msgid "Modified"
 msgstr ""
 
-#: winio.c:890
+#: winio.c:898
 #, c-format
 msgid "Moved to (%d, %d) in edit buffer\n"
 msgstr ""
 
-#: winio.c:901
+#: winio.c:909
 #, c-format
 msgid "current->data = \"%s\"\n"
 msgstr ""
 
-#: winio.c:944
+#: winio.c:952
 #, c-format
 msgid "I got \"%s\"\n"
 msgstr ""
 
-#: winio.c:969
+#: winio.c:977
 msgid "Yes"
 msgstr ""
 
-#: winio.c:971
+#: winio.c:979
 msgid "All"
 msgstr ""
 
-#: winio.c:973
+#: winio.c:981
 msgid "No"
 msgstr ""
 
-#: winio.c:1110
+#: winio.c:1118
 #, c-format
 msgid "do_cursorpos: linepct = %f, bytepct = %f\n"
 msgstr ""
 
-#: winio.c:1114
+#: winio.c:1122
 msgid "line %d of %d (%.0f%%), character %d of %d (%.0f%%)"
 msgstr ""
 
-#: winio.c:1242
+#: winio.c:1250
 msgid "Dumping file buffer to stderr...\n"
 msgstr ""
 
-#: winio.c:1244
+#: winio.c:1252
 msgid "Dumping cutbuffer to stderr...\n"
 msgstr ""
 
-#: winio.c:1246
+#: winio.c:1254
 msgid "Dumping a buffer to stderr...\n"
 msgstr ""
diff --git a/proto.h b/proto.h
index bc410e36..6fe76aa3 100644
--- a/proto.h
+++ b/proto.h
@@ -38,7 +38,7 @@ extern int fill, flags,tabsize;
 
 extern WINDOW *edit, *topwin, *bottomwin;
 extern char filename[PATH_MAX];
-extern char answer[132];
+extern char *answer;
 extern char *hblank, *help_text;
 extern struct stat fileinfo;
 extern filestruct *current, *fileage, *edittop, *editbot, *filebot; 
@@ -107,6 +107,7 @@ void center_cursor(void);
 void bottombars(shortcut s[], int slen);
 void blank_statusbar_refresh(void);
 void *nmalloc (size_t howmuch);
+void *mallocstrcpy(void *dest, void *src);
 void wrap_reset(void);
 void display_main_list(void);
 void nano_small_msg(void);
diff --git a/search.c b/search.c
index bcbd48ce..4c2fdce3 100644
--- a/search.c
+++ b/search.c
@@ -34,8 +34,8 @@
 #define _(string) (string)
 #endif
 
-static char last_search[132] = "";	/* Last string we searched for */
-static char last_replace[132] = "";	/* Last replacement string */
+static char *last_search = NULL;	/* Last string we searched for */
+static char *last_replace = NULL;	/* Last replacement string */
 static int search_last_line;
 
 
@@ -67,6 +67,15 @@ int search_init(int replacing)
 /*    char buf[BUFSIZ]; */
     char *prompt, *reprompt = "";
 
+   if (last_search == NULL) {
+	last_search = nmalloc(1);
+	last_search[0] = 0;
+   }
+   if (last_replace == NULL) {
+	last_replace = nmalloc(1);
+	last_replace[0] = 0;
+   }
+
 /*
     if (last_search[0]) {
 	snprintf(buf, BUFSIZ, " [%s]", last_search);
@@ -97,13 +106,13 @@ int search_init(int replacing)
 	reset_cursor();
 	return -1;
     } else if (i == -2) {	/* Same string */
-	strncpy(answer, last_search, 132);
+	answer = mallocstrcpy(answer, last_search);
 #ifdef HAVE_REGEX_H
 	if (ISSET(USE_REGEXP))
 	    regexp_init(answer);
 #endif
     } else if (i == 0) {	/* They entered something new */
-	strncpy(last_search, answer, 132);
+	last_search = mallocstrcpy(last_search, answer);
 #ifdef HAVE_REGEX_H
 	if (ISSET(USE_REGEXP))
 	    regexp_init(answer);
@@ -131,6 +140,19 @@ int search_init(int replacing)
     return 0;
 }
 
+void not_found_msg(char *str)
+{
+    char foo[COLS];
+
+    if (strlen(str) < COLS / 2)
+	statusbar(_("\"%s\" not found"), str);
+    else {
+	strncpy(foo, str, COLS / 2);
+	foo[COLS / 2] = 0;
+	statusbar(_("\"%s...\" not found"), foo);
+    }
+}
+
 filestruct *findnextstr(int quiet, filestruct * begin, int beginx,
 			char *needle)
 {
@@ -158,7 +180,7 @@ filestruct *findnextstr(int quiet, filestruct * begin, int beginx,
 	/* finished processing file, get out */
 	if (search_last_line) {
 	    if (!quiet)
-		statusbar(_("\"%s\" not found"), needle);
+		not_found_msg(needle);
 	    return NULL;
 	}
 
@@ -193,7 +215,7 @@ filestruct *findnextstr(int quiet, filestruct * begin, int beginx,
     /* Ensure we haven't wrap around again! */
     if ((search_last_line) && (current_x >= beginx)) {
 	if (!quiet)
-	    statusbar(_("\"%s\" not found"), needle);
+	    not_found_msg(needle);
 	return NULL;
     }
 
@@ -396,7 +418,7 @@ int do_replace(void)
 {
     int i, replaceall = 0, numreplaced = 0, beginx;
     filestruct *fileptr, *begin;
-    char *copy, prevanswer[132] = "";
+    char *copy, *prevanswer = NULL;
 
     i = search_init(1);
     switch (i) {
@@ -422,7 +444,7 @@ int do_replace(void)
 	return 0;
     }
 
-    strncpy(prevanswer, answer, 132);
+    prevanswer = mallocstrcpy(prevanswer, answer);
 
 /*
     if (strcmp(last_replace, "")) 	* There's a previous replace str *
@@ -438,12 +460,12 @@ int do_replace(void)
     switch (i) {
     case -1:				/* Aborted enter */
 	if (strcmp(last_replace, ""))
-	    strncpy(answer, last_replace, 132);
+	    answer = mallocstrcpy(answer, last_replace);
 	statusbar(_("Replace Cancelled"));
 	replace_abort();
 	return 0;
     case 0:		/* They actually entered something */
-	strncpy(last_replace, answer, 132);
+	last_replace = mallocstrcpy(last_replace, answer);
 	break;
     default:
         if (i != -2) {	/* First page, last page, for example 
diff --git a/utils.c b/utils.c
index f4f51375..f538de7a 100644
--- a/utils.c
+++ b/utils.c
@@ -119,6 +119,23 @@ void *nrealloc(void *ptr, size_t howmuch)
     return r;
 }
 
+/* Copy one malloced string to another pointer.
+
+   Should be used as dest = mallocstrcpy(dest, src);
+*/
+void *mallocstrcpy(void *dest, void *src)
+{
+
+    if (dest != NULL)
+	free(dest);
+
+    dest = nmalloc(strlen(src) + 1);
+    strcpy(dest, src);
+
+    return dest;
+}
+
+
 /* Append a new magic-line to filebot */
 void new_magicline(void)
 {
diff --git a/winio.c b/winio.c
index 721f0924..3a92bad0 100644
--- a/winio.c
+++ b/winio.c
@@ -222,32 +222,38 @@ void check_statblank(void)
 void nanoget_repaint(char *buf, char *inputbuf, int x)
 {
     blank_statusbar();
-    mvwaddstr(bottomwin, 0, 0, buf);
-    waddstr(bottomwin, inputbuf);
-    wmove(bottomwin, 0, x);
+    if (x <= COLS) { 
+        mvwaddstr(bottomwin, 0, 0, buf);
+        waddnstr(bottomwin, inputbuf, COLS - strlen(buf));
+
+    } else if (x > COLS && x <= COLS * 2)
+	mvwaddnstr(bottomwin, 0, 0, &inputbuf[COLS - strlen(buf)], COLS);
+    else
+	mvwaddnstr(bottomwin, 0, 0, &inputbuf[COLS * (x / COLS) - 
+					strlen(buf)], COLS);
+
+    wmove(bottomwin, 0, (x % COLS));
+
 }
 
 /* Get the input from the kb, this should only be called from statusq */
 int nanogetstr(char *buf, char *def, shortcut s[], int slen, int start_x)
 {
     int kbinput = 0, j = 0, x = 0, xend;
-    int x_left = 0;
-    char inputstr[132], inputbuf[132] = "";
-
-    blank_statusbar();
-    mvwaddstr(bottomwin, 0, 0, buf);
-    if (strlen(def) > 0)
-	waddstr(bottomwin, def);
-    wrefresh(bottomwin);
+    int x_left = 0, inputlen;
+    char *inputbuf;
+    
+    inputbuf = nmalloc(strlen(def) + 1);
+    inputbuf[0] = 0;
 
     x_left = strlen(buf);
     x = strlen(def) + x_left;
 
     /* Get the input! */
-    if (strlen(def) > 0) {
-	strcpy(answer, def);
+    if (strlen(def) > 0)
 	strcpy(inputbuf, def);
-    }
+
+    nanoget_repaint(buf, inputbuf, x);
 
     while ((kbinput = wgetch(bottomwin)) != 13) {
 	for (j = 0; j <= slen - 1; j++) {
@@ -307,9 +313,7 @@ int nanogetstr(char *buf, char *def, shortcut s[], int slen, int start_x)
 		    inputbuf[strlen(inputbuf) - 1] = 0;
 		}
 	    }
-	    blank_statusbar();
-	    mvwaddstr(bottomwin, 0, 0, buf);
-	    waddstr(bottomwin, inputbuf);
+	    nanoget_repaint(buf, inputbuf, x);
 	case KEY_LEFT:
 	    if (x > strlen(buf))
 		x--;
@@ -378,11 +382,15 @@ int nanogetstr(char *buf, char *def, shortcut s[], int slen, int start_x)
 	default:
 	    if (kbinput < 32)
 		break;
-	    strcpy(inputstr, inputbuf);
-	    inputstr[x - strlen(buf)] = kbinput;
-	    strcpy(&inputstr[x - strlen(buf) + 1],
-		   &inputbuf[x - strlen(buf)]);
-	    strcpy(inputbuf, inputstr);
+
+	    inputlen = strlen(inputbuf);
+	    inputbuf = nrealloc(inputbuf, inputlen + 2);
+
+	    memmove(&inputbuf[x - x_left + 1], 
+			&inputbuf[x - x_left],
+                        inputlen - (x - x_left) + 1);
+	    inputbuf[x - x_left] = kbinput;
+
 	    x++;
 
 	    nanoget_repaint(buf, inputbuf, x);
@@ -393,7 +401,7 @@ int nanogetstr(char *buf, char *def, shortcut s[], int slen, int start_x)
 	wrefresh(bottomwin);
     }
 
-    strncpy(answer, inputbuf, 132);
+    answer = mallocstrcpy(answer, inputbuf);
 
     /* Now that the text is editable instead of bracketed, we have to 
        check for answer == def, instead of answer == "" */
-- 
GitLab