1. Tabulators.......
- Posted by Patrick Quist <quistnet at HOTMAIL.COM> Mar 11, 1999
- 367 views
Hy, Can someone help me with this.... It's something that converts "\t" to " " With "\tProgress\tBar\tTest\t..." it works, but not with "Progress\tBar\tTest\t..." Very strange. But it's ofcours a mathematical error. [BOF] function multimatch(sequence str,sequence cstr) sequence temp1,temp2 object loc,pl temp1="" temp2=cstr pl=0 while 1 do loc=match(str,temp2) if loc=0 then exit else pl=pl+1 temp1=append(temp1," ") temp1[pl]=loc+((pl-1)*length(str)) for a=1 to length(str) do temp2=temp2[1..loc-1] & temp2[loc+1..length(temp2)] end for end if end while return temp1 end function global function convertTab(sequence text,integer tabsize) object tmp1,tab,count tab="" count=0 tmp1=multimatch("\t",text) tabsize+=1 for a=1 to tabsize do tab=tab&" " end for for a=1 to length(tmp1) do if tmp1[a]=(a-1)*tabsize then text=text[1..a-1+count] & tab[1..length(tab)] & text[a+1+count..length(text)] count+=tabsize else for b=1 to tabsize do if tmp1[a]=(a-1)*tabsize+b+count then text=text[1..a-1+count] & tab[1..length(tab)-b] & text[a+1+count..length(text)] count+=tabsize-b end if end for end if end for return text end function sequence text text=convertTab("\tProgress\tBar\tTest\t...",8) [EOF] Bye, PQ QC Get Your Private, Free Email at http://www.hotmail.com
2. Re: Tabulators.......
- Posted by JJProg at CYBERBURY.NET Mar 11, 1999
- 353 views
EU>Hy, EU>Can someone help me with this.... EU>It's something that converts "\t" to " " EU>With "\tProgress\tBar\tTest\t..." it works, but not with EU> "Progress\tBar\tTest\t..." EU>Very strange. EU>But it's ofcours a mathematical error. I don't know why it works, but this should work: global function convertTab(sequence s, integer n) sequence r integer i i = 1 r = "" while i <= length(s) do if s[i] = '\t' then r = r & repeat(' ',n) else r = r & s[i] end if i = i + 1 end while return r end function Jeffrey Fielding JJProg at cyberbury.net http://members.tripod.com/~JJProg/
3. Re: Tabulators.......
- Posted by "Carl R. White" <C.R.White at SCM.BRAD.AC.UK> Mar 11, 1999
- 358 views
On Thu, 11 Mar 1999, Patrick Quist wrote: ] Can someone help me with this.... ] It's something that converts "\t" to " " ] With "\tProgress\tBar\tTest\t..." it works, but not with ] "Progress\tBar\tTest\t..." ] Very strange. ] But it's ofcours a mathematical error. [Code snipped to save space. This post is long enough... See previous post for Patrick's code.] Multimatch is a bit confusing. From what I can tell, you're trying to return all the positions within the first string that the second occurs. However this is an ambiguous problem. What should it return if given: multimatch("aaaaaa", "aaa")? Should it return {1,4} or {1,2,3,4}? I understand in the case of your program, that the former is more acceptable :) Here's one of my infamous on-the-fly rewrites: function multimatch(sequence sub, sequence main) -- Parameter order changed to match that of Euphoria's match() sequence matches integer pos, totalpos matches = {} totalpos = 0 pos = match(sub, main) while pos do totalpos = totalpos + pos -- Remember where we are along 'main' matches = matches & totalpos pos = 0 -- We'd get some nasty errors without the 0 and 'if' if totalpos+length(sub) <= length(main) then pos = match(sub, main[totalpos+length(sub)..length(main)]) end if end while return matches end function function convertTab(sequence str, integer tabsize) sequence tabs, spaces tabs = multimatch("\t", str) if not length(tabs) then return str end if spaces = repeat(' ', tabsize) for i = 1 to length(tabs) do str = str[1..tabs[i]-1] & spaces[1..tabsize-remainder(tabs[i]-1, tabsize)] str[tabs[i]+1..length(str)] end for return str end function HTH, Carl -- Carl R White -- Final Year Computer Science at the University of Bradford E-mail........: cyrek- at -bigfoot.com -- Remove hyphens. Ta :) URL...........: http://www.bigfoot.com/~cyrek/ Uncrackable...: "19.6A.23.38.52.73.45 25.31.1C 3C.53.44.39.58"
4. Re: Tabulators.......
- Posted by Patrick Quist <quistnet at HOTMAIL.COM> Mar 11, 1999
- 349 views
> >Multimatch is a bit confusing. From what I can tell, you're trying to >return all the positions within the first string that the second occurs. >However this is an ambiguous problem. What should it return if given: > > multimatch("aaaaaa", "aaa")? > >Should it return {1,4} or {1,2,3,4}? > Neither, it returns {} because the 1st argument is bigger thatn the 2nd one. You should ask multimatch("aaa","aaaaaa"), and then it returns {1,4} (I think I change it to {"long","short"} lookes nicer) But there was nothing wrong with my multimatch code, (except mine was a bit long, but I like to do things difficult) It's the convertTab() that's causing the trouble, If I run : convertTab("\tHello,\tI'm Crazy\t!!!",8) it returns:" Hello, I' Crazy !!!" ^-- Where is the 'm' ? (if you run on my code, it returns the same) So your code is the same but shorter. Bye, PQ QC Get Your Private, Free Email at http://www.hotmail.com
5. Re: Tabulators.......
- Posted by Irv Mullins <irv at ELLIJAY.COM> Mar 11, 1999
- 348 views
On Thu, 11 Mar 1999 03:18:02 PST, Patrick Quist <quistnet at HOTMAIL.COM> wrote: >Hy, > >Can someone help me with this.... >It's something that converts "\t" to " " >With "\tProgress\tBar\tTest\t..." it works, but not with > "Progress\tBar\tTest\t..." >Very strange. >But it's ofcours a mathematical error. > I know you're looking for the math error, but why not just use: function replace(sequence oldstr, sequence text, sequence newstr) integer x x = match(oldstr,text) while x do text = text[1..x-1] & newstr & text[x+length(oldstr)..length(text)] x = match(oldstr,text) end while return text end function sequence text text = "\tProgress\tBar\tTest..." text = replace("\t",text," ") puts(1,text) <snip old code> Irv
6. Re: Tabulators.......
- Posted by "Carl R. White" <C.R.White at SCM.BRAD.AC.UK> Mar 11, 1999
- 349 views
On Thu, 11 Mar 1999, Patrick Quist wrote: ] >However this is an ambiguous problem. What should it return if given: ] > multimatch("aaaaaa", "aaa")? ] >Should it return {1,4} or {1,2,3,4}? ] ] Neither, it returns {} because the 1st argument is bigger thatn the 2nd ] one. ] You should ask multimatch("aaa","aaaaaa"), and then it returns {1,4} Hmm. I was already thinking ahead to my example. Sorry... :) ] ... there was nothing wrong with my multimatch code, ] (except mine was a bit long, but I like to do things difficult) I have a habit of rewriting people's code to fit my personal style. It's not because I don't like your code, it's because rewriting it helps me (and maybe others) understand it better. ] It's the convertTab() that's causing the trouble, ] If I run : convertTab("\tHello,\tI'm Crazy\t!!!",8) ] it returns:" Hello, I' Crazy !!!" ] ^-- Where is the 'm' ? Running my code mentally assuming multimatch is Ok (using dots to represent tabbed spaces): ........Hello, Ah-ha. Bug found. The tab positions returned by multimatch() no longer apply to str. str has been made longer by adding spaces. /me slaps forehead Here's a rewritten convertTab(): function convertTab(sequence str, integer tabsize) sequence tabs, spaces integer howfar tabs = multimatch("\t", str) if not length(tabs) then return str end if spaces = repeat(' ', tabsize) for i = 1 to length(tabs) do howfar = tabsize - remainder(tabs[i]-1), tabsize) str = str[1..tabs[i]-1] & spaces[1..howfar] str[tabs[i]+1..length(str)] -- stretch 'tabs' to accomodate added spaces tabs[i..length(tabs)] = tabs[i..length(tabs)] + howfar -- if we don't need 'tabs' again we could really shorten this to: -- tabs = tabs + howfar -- or use += with 2.1 end for return str end function See if this works :) Carl -- Carl R White -- Final Year Computer Science at the University of Bradford E-mail........: cyrek- at -bigfoot.com -- Remove hyphens. Ta :) URL...........: http://www.bigfoot.com/~cyrek/ Uncrackable...: "19.6A.23.38.52.73.45 25.31.1C 3C.53.44.39.58"
7. Re: Tabulators.......
- Posted by Patrick Quist <quistnet at HOTMAIL.COM> Mar 12, 1999
- 346 views
> >See if this works :) >Carl > Hy, The code you send was better, but this is it.... You had : str = str[1..tabs[i]-1] & spaces[1..howfar] & str[tabs[i]+1..length(str)] But the +1 is not needed somehow... It's perfect now, With "\tHello,\tI'm Crazy\t!!!",8 it returns " Hello, I'm Crazy !!!" ^^^^^^^^ ^^ ^^^^^^^ (also with other examples it's very good) 8 spaces = 1xtab 6 letters & 2 spaces = 6+2 = 1xtab 9 letters & 7 spaces = 9+7 = 16 = 2xtabs Thanks for your help.... [BOF] function multimatch(sequence sub, sequence main) -- Parameter order changed to match that of Euphoria's match() sequence matches integer pos, totalpos matches = {} totalpos = 0 pos = match(sub, main) while pos do totalpos = totalpos + pos matches = matches & totalpos pos = 0 if totalpos+length(sub) <= length(main) then pos = match(sub, main[totalpos+length(sub)..length(main)]) end if end while return matches end function function convertTab(sequence str, integer tabsize) sequence tabs, spaces integer howfar tabs = multimatch("\t", str) if not length(tabs) then return str end if spaces = repeat(' ', tabsize) for i = 1 to length(tabs) do howfar = tabsize - remainder(tabs[i], tabsize) str = str[1..tabs[i]-1] & spaces[1..howfar] & str[tabs[i]..length(str)] tabs[i..length(tabs)] = tabs[i..length(tabs)] + howfar end for return str end function sequence text text=convertTab("\tHello,\tI'm Crazy\t!!!",8) puts(1,text) [EOF] Bye, PQ QC Get Your Private, Free Email at http://www.hotmail.com
8. Re: Tabulators.......
- Posted by Patrick Quist <quistnet at HOTMAIL.COM> Mar 12, 1999
- 353 views
Hy, I normal DOS you don't the {9}'s but when I traced I saw that the {9}'s ("\t") still existed and that the tabs are 1 to short So I added this to change the 9's to 32's function deleteTabSign(sequence str) sequence tabs tabs = multimatch("\t", str) for a=1 to length(tabs) do str[a]=' ' end for return str end function Thanks again, PQ QC Get Your Private, Free Email at http://www.hotmail.com