Aug 93 Tips, Tidbits
Volume Number: | | 9
|
Issue Number: | | 8
|
Column Tag: | | Tips & Tidbits
|
Tips & Tidbits
By Neil Ticktin, Editor-in-Chief
This column is your opportunity to spread the word about little bits of information that you find out about. These tidbits can be programming related or they can be user tips that are particularly useful to programmers.
MacTech Magazine will pay $25 for every tip used, and $50 for the Tip of the Month. Or you can take your award in orders or subscriptions.
To submit a tip, send in a letter to the magazine. E-mail is our preferred method, but feel free to send something via the US Mail. See page two for all addresses. If you do send snail mail, enclose a printed copy and a disk copy of the letter so that it does not have to be retyped.
Tip of the Month
If you log a MacsBug disassembly to a file the instructions are saved in the form:
+0000 40809A7C MOVEC CACR,D1 | 4E7A 1002
+0004 40809A80 ADDQ.W #$8,D1 | 5041
One day I got sick of editing disassembled code, especially the code I wanted to recompile later. I wrote an MPW script to edit MacsBug disassembly log file into code that is easy to read and recompile, like this:
MOVEC CACR,D1
ADDQ.W #$8,D1
Here is the script to do this. For those of you who don't know, the "#" character indicates a comment to be ignored by MPW.
#STEP1
format -f geneva -s 9 -t 26 #Set font, font size, tab size
find #Go to beginning of file
Loop #Execute lines within loop repeatedly
# Next line makes a selection of: spaces that are followed
# by a "+" all text between that and the next several
# spaces, And all text between the previous two and the next
# several spaces. Selects everything in front of the Opcode
# (MOVEC). Example - Selection between ""
# " +0000 40809A7C "MOVEC CACR,D1 | 4E7A 1002
find /" "++/:/" "+/:/" "+/
replace § "t" #Replace the selection with a tab
find /" "+/ #Select the spaces after the Opcode
replace § "t" #Replace the selection with a tab
find /" "+/:/ / #Selection starts after the Operand
#(CACR,D1) and ends at the end of the line
replace § ""#Replace above selection with nothing
End#Loop if not at the end of the file
#STEP 2 - Clean up all RTS instructions
find
Loop #Loop until end of file reached
find /RTS/#Find an "RTS" string
find /t/:/ / #Select all text after "RTS" to end of line
replace § ""#Replace with nothing
End
Execute STEP1 and STEP2 separately! In MPW, make the window that contains your disassemble routine the target window - click on it and then click back to the window that contains the above script. Select the lines following STEP1 and hit the "Enter" key. Then select STEP2 and hit Enter again. Your code should nicely align into the format shown above. The formatted code needs little editing before it can be recompiled.
- Greg Pribyl
Incline Village, Nevada
An Anonymouse Tip
According to Inside Macintosh Volume VI, the Macintosh File Manager is fully implemented in A/UX. This may be true when accessing Macintosh volumes. However, if you are writing to a Unix partition there is a subtle difference in behavior which can cause headaches.
If you set the logical end-of-file to zero, using a call such as "PBSetEOF", you might assume that the file position would automatically be set to zero as well, so that if you subsequently write to the file the data will be written starting at the zero position. This is in fact what happens if the file is on a Mac volume.
However, if it's on a UNIX volume, you get a nasty surprise. The file position is evidently NOT changed by the call to "PBSetEOF". Thus, subsequent writing will begin at the old position, which may not be zero. Example: You have a file of 1 megabyte which you want to overwrite with new data and the position happens to be at the end of the file. You set the logical end-of-file to zero, the File Manager reports no error, and so you go ahead and write the new data (again with no error reported). You discover that the file now contains a megabyte of null characters followed by the new data! This is a quick way to fill a disk with garbage!
MORAL: Explicitly set the file position to zero whenever you set the logical end-of-file to zero. And in general, always set the position to less than or equal to the logical end-of-file whenever you reduce the latter.
- Anonymous(e)
Hiding from MacsBug
Under System 7, if you place MacsBug's resources in the system sub-folder called Preferences, Macsbug will ignore the resource file during startup. Place the MacsBug resources in the system folder only!
This is useful if you want to hide these resources from MacsBug.
- Greg Pribyl
Incline Village, Nevada
Making use of a fast Tool
The StreamEdit tool introduced with MPW 3.2 doesnt actually add a great deal of functionality to MPW. However, its main advantage is that its fast. If you have any shell scripts that do repetitive string manipulations, you can usually speed them up by rewriting them to use StreamEdit.
For example, in one of my projects, I have a special shell script to construct the makefile. Among other things, this script scans a dependencies file, with lines that look like
Module1 Module2 Type
to indicate that Module1 imports something from Module2 (Type indicates whether the dependency is in the definition or implementation module).
The script used to scan this file by opening it in the editor and using Find commands, followed by Catenate commands to read from the current selection. It used to take about 15 minutes to execute. After I rewrote it to use StreamEdit, it took 90 seconds.
Even a simple thing like generating a rule to compile all the source files in the current directory can benefit from StreamEdit. Heres the old way I used to build the object library:
Set Ident '[A-Za-z0-9]+'
Echo -n 'MyModLib.o '
For ThisModule in "{Mods}" .mod
(Evaluate "{ThisModule}" =~
/ :({Ident})®1.mod/)
>Dev:Null
Echo -n
' 'ntt'"{Objs}"'{®1}'.mod.o'
End # For
And heres the new way:
# 2
Set Ident '[A-Za-z0-9]+'
Echo -n 'MyModLib.o '
Files "{Mods}" .mod |
StreamEdit -d -e
"/:({Ident})®1.mod/ "
"print ' '; print -n"
" 'tt"{Objs}"'®1'.mod.o'"
Another advantage of StreamEdit is that, by avoiding use of editor commands like Open and Find, your script can execute in the background under ToolServer.
- Lawrence DOliveiro
Computer Services Dept.
University of Waikato
Hamilton, New Zealand