Discussion:
colouring line by line ?
Jenô Balaskó
2009-06-23 07:49:27 UTC
Permalink
Hi,

we developed a cource code coverage analyzer program. It lists for all file the coverage line by line.
e.g foo.txt:1525:20 means line 1525 was used 20 times. It would be useful to read the file coloured according this result, e.g the not used lines would be grey, the very often used lines green.
This is our business, I'm interested only if there is any support in nedit for this kind of problem.

Thanks in advance
Attila Jeno Balasko
--
NEdit Discuss mailing list - Discuss-***@public.gmane.org
http://www.nedit.org/mailman/listinfo/discuss
Michael Smith
2009-06-23 08:41:11 UTC
Permalink
On Tue, 23 Jun 2009 09:49:27 +0200
Post by Jenô Balaskó
Hi,
we developed a cource code coverage analyzer program. It lists for all file the coverage line by line.
e.g foo.txt:1525:20 means line 1525 was used 20 times. It would be useful to read the file coloured according this result, e.g the not used lines would be grey, the very often used lines green.
This is our business, I'm interested only if there is any support in nedit for this kind of problem.
Thanks in advance
Attila Jeno Balasko
I have a set of scripts and macro files which highlight differences against cvs and hg. They could be adapted to your requirements.

This script invokes nc and checks for differences against the version control system. It accepts arguments of the form file:line which is output by grep -n


#! /bin/ksh
# name: nb
for i in $*;
do
file_name=`echo $i | awk -v FS=: '{ print $1 }' -`
line_number=`echo $i | awk -v FS=: '{ print $2 }' -`

if [ -d $file_name ]
then
echo $file_name "is a directory"
else
diff=`$NEDIT_HOME/get-cvs-diff $file_name`
# echo $diff

if [ -z "$line_number" ]
then
param=$diff
else
param=$diff"+l_"$line_number"_0"
fi

if [ ! -z "$param" ]
then
cmd="-do mark_diff(\"$param\")"
else
cmd=
fi

# echo "["$cmd"]"
$NEDIT_HOME/nc $cmd $file_name
fi
done

This script outputs encoded diff information:

#! /bin/ksh
# name: get-cvs-diff
dir=`echo $1 | awk -v FS=/ '{ for(i=1;i<NF;i++) printf("%s/",$i) }' -`
cvsdir=$dir"CVS"
if [ -d $cvsdir ]
then
cvs status $1 | egrep "Needs Merge|Locally Modified" > /dev/null
if [ $? -eq 0 ]
then
MACHINE_KIND=`uname -s`
if [ "$MACHINE_KIND"=="OSF1" ]
then
tmpfile="/tmp/np.tempfile"
else
tmpfile=`mktemp /tmp/np.XXXXXX`
fi
awk -f $NEDIT_HOME/line-starts.awk $1 > $tmpfile
cvs diff $1 | egrep -v "[\<\>\-]" | egrep "^[0-9].*" >> $tmpfile
awk -f $NEDIT_HOME/analyse-change.awk $tmpfile
rm -f $tmpfile
fi
else
if [ -x `which hg` ]
then
hg root > /dev/null
if [ $? -eq 0 ]
then
MACHINE_KIND=`uname -s`
if [ "$MACHINE_KIND"=="OSF1" ]
then
tmpfile="/tmp/np.tempfile"
else
tmpfile=`mktemp /tmp/np.XXXXXX`
fi
awk -f $NEDIT_HOME/line-starts.awk $1 > $tmpfile
hg diff $1 >> $tmpfile
awk -f $NEDIT_HOME/analyse-change-hg.awk $tmpfile
# cat $tmpfile
rm -f $tmpfile
fi
fi
fi

This is line-starts.awk. Highlighting works per character so you need to associate lines with character indexes.

BEGIN {
total = 0
}

{
printf("line-start,%s,%s\n",FNR,total)
total = total + length + 1
}

END {
printf("line-start,%s,%s\n",FNR+1,total)
}

This is analyse-change.awk. It checks for diffs against cvs and outputs
stuff which is eaten by an nedit macro.

BEGIN {
FS=","
}

/line-start[,][0-9]*[,][0-9]*/ {
# print $2 " " $3
line_starts[$2]=$3
}

/[0-9]*[,][0-9]*[c][0-9]*[,][0-9]*/ {
n = split($2,range,"c")
printf ("+c_%d_%d",line_starts[range[2]],line_starts[$3 + 1])
}

#980,984c988
/^[0-9]*[,][0-9]*[c][0-9]*$/ {
n = split($2,range,"c")
printf ("+c_%d_%d",line_starts[range[2]],line_starts[range[2]+1])
}

#1676a1692
/^[0-9]*[a][0-9]*$/ {
n = split($1,range,"a")
printf ("+a_%d_%d",line_starts[range[2]],line_starts[range[2]+1])
}

#193a194,197
/^[0-9]*[a][0-9]*[,][0-9]*$/ {
n = split($1,range,"a")
printf ("+a_%d_%d",line_starts[range[2]],line_starts[$2 + 1])
}

#846c853,867
/^[0-9]*[c][0-9]*[,][0-9]*$/ {
n = split($1,range,"c")
printf ("+c_%d_%d",line_starts[range[2]],line_starts[$2 + 1])
}

#457c504
/^[0-9]*[c][0-9]*$/ {
n = split($1,range,"c")
printf ("+c_%d_%d",line_starts[range[2]],line_starts[range[2]+1])
}

function print_count()
{
if(inplus == 1)
{
if(minuslines > 0)
{
printf
("+c_%d_%d",line_starts[plusstart+1],line_starts[plusstart+minuslines+1])
minuslines = 0 }
printf
("+a_%d_%d",line_starts[plusstart+minuslines+1],line_starts[plusstart+pluslines+1])
inplus = 0 }
}

This is the version for hg


BEGIN {
FS=","
}

/line-start[,][0-9]*[,][0-9]*/ {
# print $2 " " $3
line_starts[$2]=$3
count = 0
next
}

# Add 6 lines after 109
#@@ -109,6 +109,10 @@
#/[@@]{2}\s-[0-9]+[,][0-9]+ +[0-9]+[,][0-9]+\s[@@]{2}/ {

/^[\@]+[.]*[\@]+/ {
# print "match: " $0
split($0,fields," ")
n = split(fields[2],range1,"[,]")
n = split(fields[3],range2,"[,]")
# print "0: " $0
# print "fields[2]: " fields[2]
# print "fields[3]: " fields[3]
# print "range1[2]: " range1[2]
# print "range2[1]: " range2[1]
lines = range1[2] + 0
start = range2[1] + 0
line = range2[1] - 1
count = range2[2];
minuslines = 0
# printf("count: %d\n",count)
# printf ("+c_%d_%d\n",line_starts[start],line_starts[start+lines])
}

/^[\+]+/ {
if(count > 0)
{
if(inplus == 0)
{
inplus = 1
plusstart = line
pluslines = 1
}
else
{
pluslines++
}
# print "PLUS: line " line " " $0
}
line++
}

/^[\-]+/ {
if(count > 0)
{
minuslines++
}
}

/^[\ ]+/ {
print_count()
line++
}

{
# print "count: " count
# print "inplus: " inplus
# print "plusstart: " plusstart
# print "pluslines: " pluslines
if(count > 0)
{
count--
}
else
{
print_count()
}
}

END {
print_count()
}

This is highlight.nm. It defines the mark_diff function which parses the output of the above scripts and puts backlight into the window.

# Calculate line start points
define calculate_line_starts
{
$line_starts = $empty_array
line_number = 1
$line_starts[line_number] = 0
end_line = 0
while(end_line != -1)
{
end_line = search("^.*$",$line_starts[line_number] + 1,"regex")
if(end_line != -1)
{
line_number = line_number + 1
$line_starts[line_number] = end_line
}
}
}

#Jump to the specified line
define mark_line
{
line_command=$1 ",0"
goto_line_number(line_command)
end=search("$",$cursor,"regex")
nextline=search("^",end,"regex")
if(nextline == -1) nextline = end
rangesets=rangeset_get_by_name("entry-points")
if(rangesets[] == 0)
{
rangeset=rangeset_create()
rangeset_set_name(rangeset,"entry-points")
rangeset_set_color(rangeset,"LightBlue")
}
else
{
rangeset=rangesets[0]
}
rangeset_add(rangeset,$cursor,nextline)
}

#mark differences
define mark_diff
{
addra=rangeset_get_by_name("addr")
cddra=rangeset_get_by_name("cddr")
rangeset_destroy(addra)
rangeset_destroy(cddra)
if(length($1) > 0)
{
addr = rangeset_create()
cddr = rangeset_create()
rangeset_set_name(addr,"addr")
rangeset_set_name(cddr,"cddr")
rangeset_set_color(addr,"LightYellow1")
rangeset_set_color(cddr,"LightPink")
lines=split($1,"+")
for(line in lines)
{
details=split(lines[line],"_")
if(details[0] == "a")
{
rangeset_add(addr,details[1],details[2])
}
if(details[0] == "c")
{
rangeset_add(cddr,details[1],details[2])
}
if(details[0] == "l")
{
mark_line(details[1])
}
}
}
}

#Search for blocks to be hidden in the input file and fold them
define hide_blocks
{
rangeset_defined = 0
start_block = 0
end_block = 0
while(start_block != -1 && end_block != -1)
{
start_block = search("--CONTENT*PROTECTED",end_block)
if(start_block != -1)
{
end_block = search("--CONTENT*UNPROTECTED",start_block)
if(end_block == -1)
{
loop = start_block
while(loop != -1)
{
loop = search("^.*$",loop + 1,"regex")
if(loop != -1)
{
end_block = loop
}
}
}
if(end_block != -1)
{
next_line = search("^.*$",end_block + 1,"regex")
if(next_line == -1)
{
next_line = end_block
}
if(rangeset_defined == 0)
{
r = rangeset_create()
rangeset_defined = 1
}
rangeset_add(r,start_block,next_line)
}
}
}
if(rangeset_defined != 0)
{
rangeset_set_color(r,"violet")
rangeset_set_folded(r,1)
}
}


Clearly I had a lot more time on my hands when I wrote this stuff.
--
Michael Smith
Network Applications
www.netapps.com.au | +61 (0) 416 062 898
Web Hosting | Internet Services
Bert Wesarg
2009-06-23 08:51:06 UTC
Permalink
Post by Jenô Balaskó
Hi,
we developed a cource code coverage analyzer program. It lists for all file the coverage line by line.
e.g foo.txt:1525:20  means line 1525 was used 20 times. It would be useful to read the file coloured according this result, e.g  the not used lines would be grey, the very often used lines green.
This is our business, I'm interested only if there is any support in nedit for this kind of problem.
You can use the RangeSets API, a convenient macro set may help you here:

http://nedit.hackvalue.nl/niki/index.php/RangesetMacroCollection

There is currently one little drawback: you can only highlight a line
till the \n character not till the window boundary, if I remember
correctly.

Bert
Post by Jenô Balaskó
Thanks in advance
Attila Jeno Balasko
--
http://www.nedit.org/mailman/listinfo/discuss
--
NEdit Discuss mailing list - Discuss-***@public.gmane.org
http://www.nedit.org/mailman/listinfo/discuss
Jenô Balaskó
2009-06-25 09:02:12 UTC
Permalink
Hi Bert,

thanks for the help. I will send feedback if we have the solution.

Regards
Attila
-----Original Message-----
Sent: Tuesday, June 23, 2009 10:51 AM
To: General NEdit discussion list
Subject: Re: colouring line by line ?
On Tue, Jun 23, 2009 at 09:49, Jenô
Post by Jenô Balaskó
Hi,
we developed a cource code coverage analyzer program. It
lists for all file the coverage line by line.
Post by Jenô Balaskó
e.g foo.txt:1525:20  means line 1525 was used 20 times. It
would be useful to read the file coloured according this
result, e.g  the not used lines would be grey, the very often
used lines green.
Post by Jenô Balaskó
This is our business, I'm interested only if there is any
support in nedit for this kind of problem.
You can use the RangeSets API, a convenient macro set may
http://nedit.hackvalue.nl/niki/index.php/RangesetMacroCollection
There is currently one little drawback: you can only
highlight a line till the \n character not till the window
boundary, if I remember correctly.
Bert
Post by Jenô Balaskó
Thanks in advance
Attila Jeno Balasko
--
http://www.nedit.org/mailman/listinfo/discuss
--
http://www.nedit.org/mailman/listinfo/discuss
--
NEdit Discuss mailing list - Discuss-***@public.gmane.org
http://www.nedit.org/mailman/listinfo/discuss
Loading...