Ever have a tool like lint, gcc, grep, or the like, whose output references many different places? And then you have to painstakingly check out each of those places by hand? And wouldn't it be nice if you could load the output of that tool into DevStudio and then just double-click on the line and jump straight to that location?
Yeah, me too. But short of writing a full-blown DevStudio Add-In or Macro, which requires some actual work, I didn't know how to do it. Now I do and I'm sharing it for the other equally-clueless out there. And most of us know who we are! Background My boss ran lint on some code I had written. This version of lint is extremely picky (good) and resulted in 12,115 lines to check out (bad). Much of it was ignorable but it all had to be checked out. But the time and effort of just going to the indicated lines was looking at about 3 days minimum. 3 looong days. There had to be a better way. So I looked around at the usual places and was surprised to find no help on how to get an arbitrary file into a DevStudio Output window. I'm sure there is a Microsoft article somewhere, but I couldn't find it. There were several articles on writing Add-Ins and Macros, including the requirements for formatting the filename and line number, but nothing more basic. It turns out to be very simple. You add a tool to DevStudio, run that tool, and the tool's standard (console) output goes into its own Output Window. Adding the Tool: Step by StepFrom within DevStudio: Go to the Tools menu, and select Customize... Select the Tools tab Scroll to the bottom Double-click on the empty rectangle Type name of tool, say "Dump file" Check "Use output window" Check "Prompt for arguments" Set the command to some program that will copy its argument to stdout (I use catfile.bat, shown in all its glory below) Set the initial directory to $(Wkspdir) or whatever directory turns you on the most The tool to execute, catfile.bat, is complicated in the extreme. Here's the source: type %1 Using the Tool Example -- Lint output OK, here is an example. Here are a few lines from that dreadful lint output: memcpy(&tmpOID[1], &almOID[0], oidLength * sizeof(OIDC_T)); SCTE-Alarms.cpp 599 Info 737: Loss of sign in promotion from int to unsigned int SCTE-Alarms.cpp 599 Warning 534: Ignoring return value of function 'memcpy(void *, const void *, unsigned int)' (compare with line 44, file string.h) string.h 44 Info 830: Location cited in prior message - int fullLen = tmpOID[0] + 1; // number of components in tmpOID[] SCTE-Alarms.cpp 601 Info 713: Loss of precision (initialization) (unsigned long to int) Now before going further, note that the filename and line number sequences are not in a format that DevStudio will recognize. DevStudio wants a sequence like: filename(linenumber): stuffSo I used a little Perl script to munge the file: my @file = <>; chomp @file; my $line; foreach $line (@file) { if($line =~ m/^(\S+)\s+(\d+)(.+)/) { print "$1($2):$3\n"; } else { print $line, "\n"; } } Now the lines (which I saved in "munged.txt") look like: memcpy(&tmpOID[1], &almOID[0], oidLength * sizeof(OIDC_T)); SCTE-Alarms.cpp(599): Info 737: Loss of sign in promotion from int to unsigned int SCTE-Alarms.cpp(599): Warning 534: Ignoring return value of function 'memcpy(void *, const void *, unsigned int)' (compare with line 44, file string.h) string.h(44): Info 830: Location cited in prior message _ int fullLen = tmpOID[0] + 1; // number of components in tmpOID[] SCTE-Alarms.cpp(601): Info 713: Loss of precision (initialization) (unsigned long to int) (Obviously, if I was going to be doing this a lot, I would have a dedicated command to do the lint and then the Perl.) Now, to use the Dump file tool in DevStudio: Click on the Tools menu Click on "Dump file" and note that a window pops up asking for the name of the file: Enter the name of the file (as shown) and hit OK. Make sure that "Redirect to Output window" is checked. That is the point of this exercise! The file is loaded into its own Output Window pane. Double-click on a line and see the indicated line show up! Another Example using GCCOK, let's try another one. I used gcc on a file and got this error output: sys_conf.h:709: error: `ULONG' was not declared in this scope sys_conf.h:709: error: syntax error before `)' token The filename and linenumber are still not quite right, but this Perl script fixes that: my @file = <>; chomp @file; my $line; foreach $line (@file) { if($line =~ m/^([^:]+):(\d+):(.+)/) { print "$1($2):$3\n"; } else { print $line, "\n"; } } yielding munged lines like: sys_conf.h(709): error: `ULONG' was not declared in this scope sys_conf.h(709): error: syntax error before `)' token Now run the Dump file tool and get: Points of Interest There is nothing particularly magic or clever about this. It is just neat and convenient. But there is a gotcha involved: the output window is limited to 8192 lines. And it is the last 8192 lines from your tool, not the first. Guess how I discovered this with my 12K line lint file... History 2/24/2004 -- first release 2/25/2004 -- reduced picture sizes to make nice with low-resolution monitors, fixed typo
My boss ran lint on some code I had written. This version of lint is extremely picky (good) and resulted in 12,115 lines to check out (bad). Much of it was ignorable but it all had to be checked out. But the time and effort of just going to the indicated lines was looking at about 3 days minimum. 3 looong days.
There had to be a better way. So I looked around at the usual places and was surprised to find no help on how to get an arbitrary file into a DevStudio Output window. I'm sure there is a Microsoft article somewhere, but I couldn't find it. There were several articles on writing Add-Ins and Macros, including the requirements for formatting the filename and line number, but nothing more basic.
It turns out to be very simple. You add a tool to DevStudio, run that tool, and the tool's standard (console) output goes into its own Output Window. Adding the Tool: Step by StepFrom within DevStudio: Go to the Tools menu, and select Customize... Select the Tools tab Scroll to the bottom Double-click on the empty rectangle Type name of tool, say "Dump file" Check "Use output window" Check "Prompt for arguments" Set the command to some program that will copy its argument to stdout (I use catfile.bat, shown in all its glory below) Set the initial directory to $(Wkspdir) or whatever directory turns you on the most The tool to execute, catfile.bat, is complicated in the extreme. Here's the source: type %1 Using the Tool Example -- Lint output OK, here is an example. Here are a few lines from that dreadful lint output: memcpy(&tmpOID[1], &almOID[0], oidLength * sizeof(OIDC_T)); SCTE-Alarms.cpp 599 Info 737: Loss of sign in promotion from int to unsigned int SCTE-Alarms.cpp 599 Warning 534: Ignoring return value of function 'memcpy(void *, const void *, unsigned int)' (compare with line 44, file string.h) string.h 44 Info 830: Location cited in prior message - int fullLen = tmpOID[0] + 1; // number of components in tmpOID[] SCTE-Alarms.cpp 601 Info 713: Loss of precision (initialization) (unsigned long to int) Now before going further, note that the filename and line number sequences are not in a format that DevStudio will recognize. DevStudio wants a sequence like: filename(linenumber): stuffSo I used a little Perl script to munge the file: my @file = <>; chomp @file; my $line; foreach $line (@file) { if($line =~ m/^(\S+)\s+(\d+)(.+)/) { print "$1($2):$3\n"; } else { print $line, "\n"; } } Now the lines (which I saved in "munged.txt") look like: memcpy(&tmpOID[1], &almOID[0], oidLength * sizeof(OIDC_T)); SCTE-Alarms.cpp(599): Info 737: Loss of sign in promotion from int to unsigned int SCTE-Alarms.cpp(599): Warning 534: Ignoring return value of function 'memcpy(void *, const void *, unsigned int)' (compare with line 44, file string.h) string.h(44): Info 830: Location cited in prior message _ int fullLen = tmpOID[0] + 1; // number of components in tmpOID[] SCTE-Alarms.cpp(601): Info 713: Loss of precision (initialization) (unsigned long to int) (Obviously, if I was going to be doing this a lot, I would have a dedicated command to do the lint and then the Perl.) Now, to use the Dump file tool in DevStudio: Click on the Tools menu Click on "Dump file" and note that a window pops up asking for the name of the file: Enter the name of the file (as shown) and hit OK. Make sure that "Redirect to Output window" is checked. That is the point of this exercise! The file is loaded into its own Output Window pane. Double-click on a line and see the indicated line show up!
The tool to execute, catfile.bat, is complicated in the extreme. Here's the source:
type %1
OK, here is an example. Here are a few lines from that dreadful lint output:
memcpy(&tmpOID[1], &almOID[0], oidLength * sizeof(OIDC_T)); SCTE-Alarms.cpp 599 Info 737: Loss of sign in promotion from int to unsigned int SCTE-Alarms.cpp 599 Warning 534: Ignoring return value of function 'memcpy(void *, const void *, unsigned int)' (compare with line 44, file string.h) string.h 44 Info 830: Location cited in prior message - int fullLen = tmpOID[0] + 1; // number of components in tmpOID[] SCTE-Alarms.cpp 601 Info 713: Loss of precision (initialization) (unsigned long to int)
filename(linenumber): stuff
my @file = <>; chomp @file; my $line; foreach $line (@file) { if($line =~ m/^(\S+)\s+(\d+)(.+)/) { print "$1($2):$3\n"; } else { print $line, "\n"; } }
memcpy(&tmpOID[1], &almOID[0], oidLength * sizeof(OIDC_T)); SCTE-Alarms.cpp(599): Info 737: Loss of sign in promotion from int to unsigned int SCTE-Alarms.cpp(599): Warning 534: Ignoring return value of function 'memcpy(void *, const void *, unsigned int)' (compare with line 44, file string.h) string.h(44): Info 830: Location cited in prior message _ int fullLen = tmpOID[0] + 1; // number of components in tmpOID[] SCTE-Alarms.cpp(601): Info 713: Loss of precision (initialization) (unsigned long to int)
Now, to use the Dump file tool in DevStudio:
Dump file
Another Example using GCCOK, let's try another one. I used gcc on a file and got this error output: sys_conf.h:709: error: `ULONG' was not declared in this scope sys_conf.h:709: error: syntax error before `)' token The filename and linenumber are still not quite right, but this Perl script fixes that: my @file = <>; chomp @file; my $line; foreach $line (@file) { if($line =~ m/^([^:]+):(\d+):(.+)/) { print "$1($2):$3\n"; } else { print $line, "\n"; } } yielding munged lines like: sys_conf.h(709): error: `ULONG' was not declared in this scope sys_conf.h(709): error: syntax error before `)' token Now run the Dump file tool and get: Points of Interest There is nothing particularly magic or clever about this. It is just neat and convenient. But there is a gotcha involved: the output window is limited to 8192 lines. And it is the last 8192 lines from your tool, not the first. Guess how I discovered this with my 12K line lint file... History 2/24/2004 -- first release 2/25/2004 -- reduced picture sizes to make nice with low-resolution monitors, fixed typo
sys_conf.h:709: error: `ULONG' was not declared in this scope sys_conf.h:709: error: syntax error before `)' token
The filename and linenumber are still not quite right, but this Perl script fixes that:
my @file = <>; chomp @file; my $line; foreach $line (@file) { if($line =~ m/^([^:]+):(\d+):(.+)/) { print "$1($2):$3\n"; } else { print $line, "\n"; } }
sys_conf.h(709): error: `ULONG' was not declared in this scope sys_conf.h(709): error: syntax error before `)' token
There is nothing particularly magic or clever about this. It is just neat and convenient. But there is a gotcha involved: the output window is limited to 8192 lines. And it is the last 8192 lines from your tool, not the first. Guess how I discovered this with my 12K line lint file... History 2/24/2004 -- first release 2/25/2004 -- reduced picture sizes to make nice with low-resolution monitors, fixed typo
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.
A list of licenses authors might use can be found here