Sep 93 Tips, Tidbits
Volume Number: | | 9
|
Issue Number: | | 9
|
Column Tag: | | Tips & Tidbits
|
Related Into: Standard File Memory Manager
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
The toolbox call BlockMove is quite efficient and smart, especially for large chunks of data. In moving smaller pieces of memory, a very simple macro can do as well and execute much faster:
/* 1 (/
#define BLOCKMOVE(source,dest,len) \
{ typedef struct { char s[len] ; } _sss ; \
*(_sss*) (dest) = *(_sss*) (source) ;\
}
This macro generates a temporary structure of size 'len', and assigns the source structure to the destination structure. In this case the compiler will generate a tight loop moving 2 or 4 bytes of data whenever possible. There is no space penalty, i.e., it compiles to exactly the same number of bytes as a normal BlockMove.
Two restrictions apply in using BLOCKMOVE:
the parameter 'len' must be a constant.
the source and destinations cannot overlap.
Some performance comparisons:
Bytes BlockMove memcpy BLOCKMOVE
50 9 9 2
100 11 15 4
150 12 21 7
200 14 28 8
250 15 34 11
300 17 41 13
350 18 49 14
400 20 55 16
450 21 61 19
500 22 68 21
These comparisons were done on a PowerBook Duo 230 using Think C 6.0. Times are all measured in ticks for 5000 samples.
- Jan Bruyndonckx, Wave Research, Belgium
[If you are interested in more information on BlockMove, you might want to check out an article by Mike Scanlin in the May, 1993 issue of MacTech Magazine. The article is about writing a more efficient 68040 BlockMove. - Ed.]
Dump obj formatter
The MPW command 'dumpobj SomeLibrary > LibraryObjectCode.a' disassembles compiled library code into the form:
Module: Flags=$00=(Local Code) Module="SomeProcedure"(8) Segment="Main"(7)
Reference: Flags=$90=(A5Relative 16BitPatch 16BitOffsets FromCode)
Ref="arrow"(12)
0006
Content: Flags $08
Contents offset $0000 size $003A
00000000: 4E56 FFFC 'NV..' LINK A6,#$FFFC
00000004: 4AAE 0008 'J...' TST.L $0008(A6)
00000008: 6606 'f.' BNE.S *+$0008 ;00000010
The script below modifies the disassembled code into the form:
Module="SomeProcedure"(8) Segment="Main"(7)
LINK A6,#$FFFC
TST.L $0008(A6)
BNE.S *+$0008
The script:
#2
format -f geneva -s 9 -t 26 #Set font, font size, tab size
#STEP1 - removes code comments
find
Loop
#Find ; preceded by spaces & select to
# the end of line
find /" "+;/:/ /
#Replace selection with nothing
replace § ""
End
#STEP2 - removes routine text header
find
Loop
#Selects all lines between Reference &
# second word Content
#end of line to the.
find /Reference/:/Content/:/Content/:/ /
replace § ""#Replace selection with nothing
End
#STEP3 - Delete everything before exprssn
#"Module="
find
Loop
#Select everything in front of
#Module= to the beginning of the line
find /"Module="/:\\
replace § ""#Replace with nothing
find !1 #Select next line
End
#STEP4 - Formats instruction lines
find
Loop
#Find the line that starts with 4 0's
find /"0000"????/
#followed by any 4 characters.
find /?«43»/#Select 43 characters from beginning of line
replace § "t" #Replace selection w/tab
#Select spaces between Opcode and operand
find /" "+/
replace § "t" #Replace with a tab
End#Repeat the Loop until done
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 under each step separately and hit the "Enter" key. Your code should align nicely into the format shown above.
- Greg Pribyl, Incline Village, NV
Customgetfile customization
I recently had to customize a CustomGetFile dialog to select folders. The returned StandardFileReply record contains the file specificatins of the target folder. But I needed to create files inside that folder while the directory ID in the specifications refers to its parent directory.
A simple method for getting a FSSpec record having as parID the directory ID of the selected folder, thus allowing to put the name of the new file into FSSpec.name without further actions, uses FSMakeFSSpec, documented in Inside Macintosh VI (25-30):
FUNCTION FSMakeFSSpec (vRefNum:Integer; dirID: LongInt; fileName: Str255;
VAR spec: FSSpec): OSErr;
The first two parameters will be the same as in the file specifications of the target folder while fileName will contain a partial path.
/* 3 */
function FileInFolderSpec (theSpec:
FSSpec): FSSpec;
var
target: FSSpec;
fn: Str255;
error: OSErr;
begin
{theSpec: folder specifications}
fn:=Concat(':' ,theSpec.name,': ');
{create a partial path}
error:=FSMakeFSSpec(theSpec.vRefNum,
theSpec.parID, fn, target);
FileInFolderSpec:= target;
end;
A fnfErr (file or directory does not exist) error will be returned because the partial path was incomplete, ending with ':' instead of a filename, but target is nonetheless valid.
- Luigi Belverato, Milano, Italy