The following warnings occurred:
Warning [2] count(): Parameter must be an array or an object that implements Countable - Line: 795 - File: showthread.php PHP 7.4.33 (FreeBSD)
File Line Function
/showthread.php 795 errorHandler->error





Post Reply 
new program : FctBrowser [beta]
10-08-2015, 12:03 PM (This post was last modified: 10-08-2015 12:44 PM by primer.)
Post: #1
new program : FctBrowser [beta]
Hello,
I made a small function browser for prime.
[Image: 10wi820.png] [Image: r04j1h.png]

run the program by FBrowser.
Features :
  • identify function definition, display their names and params (remove comments)
  • display line number
  • visually show function decorators (exported in green, keys assign in orange)
  • user interface : move with up/down key, it scrolls the screen if needed (no mouse yet, sorry)
  • user interface : close with ESC. press ENTER to jump to line nr (well, actually it just display a msgbox because such function does not exist... Tim ? Smile)
  • it exports "fct" variable (list of function names)

Download :
.hpprgm  FBrowser.hpprgm (Size: 8.33 KB / Downloads: 13)

Version 0.1 : 8th of Oct 2015.
I may change few things in UI.

Code:
// functions browser v 0.1
// by primer - 8th of Oct 2015

#pragma mode( separator(.,;) integer(h32) )

//frw decl
pickPrg();
Analyse(p);
display();

EXPORT FBrowser() // functions browser entry point.
BEGIN
 local p:=pickPrg();
 if p≠"" then
  Analyse(p);
  display();
 end;
END;

pickPrg() // to pick a prog name
begin
 local prgs:=Programs;
 local p;
 choose(p,"Fct Browse to program",prgs);
 if p==0 then return ""; end;
 return prgs(p);
end;



collectFcts(p); //frw decl

///----------- Analysis ------------

// perform analysis on a program
Analyse(p)
begin
 collectFcts(p);
end;

/////////////////////// public vars
export fct;
export fctn;

analyseline(l,n); //frw decl

collectFcts(p)
begin
 local src:=Programs(p);
 local s:=size(src);
 local n:=1;
 local i,c,l;
 fct:={};
 fctn:={};

 l:="";
 for i from 1 to s do
  c:=mid(src,i,1);
  if c==char(10) then // line feed
   analyseline(l,n); 
   n:=n+1; // inc lin nr
   l:="";
  else
   l:=l+c;
  end;
 end; // for
 analyseline(l,n);
end;

//frw decl
trim(x);
trim_cmt(x);
register_fct(txt,n);

// statics vars
local prev:="";
local nprev:=0;

analyseline(l,n) // analyse la ligne
begin
 local a:=trim(trim_cmt(l));
 if upper(a)=="BEGIN" then
   register_fct(prev,nprev);
   prev:="";
 else
   if a≠"" then prev:=a; nprev:=n; end;
 end; // begin
end;


register_fct(txt,n) // save function information
begin
// print("L"+n+" : "+txt);
 local a:=upper(txt);
 local p:=instring(a,"EXPORT ");
 local export:=0;
 local pars:="";
 local nopar:=0;
 if p==1 then 
  txt:=trim(mid(txt,p+6));
  export:=1;
 end;
 p:=instring(a,"KEY ");
 if p==1 then 
  txt:=trim(mid(txt,p+3));
  export:=2; // it's a key assign
  nopar:=1; // no need for params
 end;

 // check is ends with ";", it should not
 if right(txt,1)==";" then return; end; // fausse alerte
 if nopar==1 then
  pars:="";
 else
  p:=instring(txt,"(");
  if p==0 then return; end; // fausse alerte :^)
  pars:=mid(txt,p);
  txt:=left(txt,p-1);
 end;
 fct:=concat(fct,txt);  
 fctn:=concat(fctn, {{n, export, pars}});
end;

trim_cmt(x) // remove cmt
begin
 local p:=instring(x,"//");
 if p==0 then return x; end;
 if p==1 then return ""; end;
 return mid(x,1,p-1);
end;

trim(x) // l/r trim
begin
 local s:=size(x);
 if s==0 then return ""; end;
 local i,a;
 local ok:=0;
 //debug;
 //left trim
 for i from 1 to s do
  if mid(x,i,1)≠" " then
   if i==1 then a:=x; else  a:=mid(x,i); end;
   ok:=1;
   break;
  end; //if
 end; //for
 if ok==0 then return ""; end;

 //right trim
 s:=size(a);
 if s==0 then return ""; end;
 for i from s downto 1 do
  if mid(a,i,1)≠" " then
   a:=mid(a,1,i);
   break;
  end; //if
 end; //for
 return a;
end;

//#missing hppl fct :  split, trim, mid(x,?,0)->"", mid(x,0)???


///----------- user interface ------------

// frw decl
initdsp();
dsploop();

display()
begin
 initdsp();
 dsploop();
end;

initdsp() // prepare G9 with all fcts from <ftc> + <ftcn> vars
begin
 local h:=SIZE(fct)*12;
 local i,t,x,p;
 DIMGROB_P(G9,300,h);
 for i from 1 to size(fct) do
  t:=fct(i);
  x:=fctn(i,2); // export y/n
  p:=fctn(i,3); // pars
  TEXTOUT_P(t,G9,10,(i-1)*12,2,#0h); // fct name
  TEXTOUT_P(p,G9,100,(i-1)*12,2,#444444h); // params
  if x==1 then RECT_P(G9,1,1+(i-1)*12,8,(i*12)-2,#21AC0Dh,#29D810h); end; // exported
  if x==2 then RECT_P(G9,1,1+(i-1)*12,8,(i*12)-2,#E7B00Eh,#F4CE59h); end; // key
 end;
end;


dsploop()
begin
 local f:=0; // ends the display loop
 local k; // key
 local pos:=1; // position
 local t; // temp txt
 local voffs:=0; // vertical offset
 while f==0 do
  RECT_P(); // clean screen
  BLIT_P(G0,40,1,G9,1,1+voffs);
  RECT_P(G0,1,(pos-1)*12-voffs,320,pos*12-voffs, {#54A7FAh, 127},{#54A7FAh, 127}); // selector
  t:=fctn(pos,1); // line nr
  TEXTOUT_P(t,G0,1,(pos-1)*12-voffs,2,#FFFFFFh,40,#0h); // fct name

  k:=wait();
  if k==30 then  f:=1; msgbox("Jump to line "+fctn(pos,1));  end; // enter
  if k==4 then  f:=1;  end; // esc
  if k==2 then // up
   pos:=max(pos-1,1);
   if pos*12-voffs<1 then    voffs:=voffs-12; end; // move veiwport up
  end;
  if k==12 then // down
   pos:=min(pos+1,size(fct));
   if pos*12-voffs>228 then    voffs:=voffs+12; end; // move veiwport down
  end;

 end; // while
end;
   

Let me know your feeling...

I've a idea for a feature that may take time to be built... too early to speak about Tongue


Regards,

primer
Find all posts by this user
Quote this message in a reply
Post Reply 


Messages In This Thread
new program : FctBrowser [beta] - primer - 10-08-2015 12:03 PM



User(s) browsing this thread: 1 Guest(s)