mirror of
https://github.com/samsonjs/samhuri.net-ios.git
synced 2026-03-25 09:25:47 +00:00
88 lines
2.6 KiB
Objective-C
88 lines
2.6 KiB
Objective-C
//
|
|
// NSMethodSignature+EXT.m
|
|
// extobjc
|
|
//
|
|
// Created by Justin Spahr-Summers on 2011-03-11.
|
|
// Copyright (C) 2012 Justin Spahr-Summers.
|
|
// Released under the MIT license.
|
|
//
|
|
|
|
#import "NSMethodSignature+EXT.h"
|
|
|
|
@implementation NSMethodSignature (EXTExtensions)
|
|
- (NSMethodSignature *)methodSignatureByInsertingType:(const char *)type atArgumentIndex:(NSUInteger)index {
|
|
NSUInteger argumentCount = [self numberOfArguments];
|
|
size_t typeLength = strlen(type);
|
|
|
|
size_t stringLength = strlen([self methodReturnType]);
|
|
for (NSUInteger i = 0;i < argumentCount + 1;++i) {
|
|
NSUInteger realIndex;
|
|
if (i == index) {
|
|
stringLength += typeLength;
|
|
continue;
|
|
} else if (i > index) {
|
|
realIndex = i - 1;
|
|
} else {
|
|
realIndex = i;
|
|
}
|
|
|
|
const char *argType = [self getArgumentTypeAtIndex:realIndex];
|
|
stringLength += strlen(argType);
|
|
}
|
|
|
|
// start counting the NUL byte for strlcpy()
|
|
stringLength++;
|
|
|
|
char *encoding = calloc(stringLength, 1);
|
|
strlcpy(encoding, [self methodReturnType], stringLength);
|
|
|
|
for (NSUInteger i = 0;i < argumentCount + 1;++i) {
|
|
NSUInteger realIndex = i;
|
|
const char *argType = NULL;
|
|
|
|
if (i == index) {
|
|
argType = type;
|
|
} else if (i > index) {
|
|
realIndex = i - 1;
|
|
}
|
|
|
|
if (!argType)
|
|
argType = [self getArgumentTypeAtIndex:realIndex];
|
|
|
|
size_t currentLength = strlen(encoding);
|
|
strlcpy(encoding + currentLength, argType, stringLength - currentLength);
|
|
}
|
|
|
|
NSMethodSignature *newSignature = [NSMethodSignature signatureWithObjCTypes:encoding];
|
|
free(encoding);
|
|
|
|
return newSignature;
|
|
}
|
|
|
|
- (const char *)typeEncoding {
|
|
NSUInteger argumentCount = [self numberOfArguments];
|
|
|
|
size_t stringLength = strlen([self methodReturnType]);
|
|
for (NSUInteger i = 0;i < argumentCount;++i) {
|
|
const char *argType = [self getArgumentTypeAtIndex:i];
|
|
stringLength += strlen(argType);
|
|
}
|
|
|
|
stringLength++;
|
|
|
|
char *encoding = calloc(stringLength, 1);
|
|
strlcpy(encoding, [self methodReturnType], stringLength);
|
|
|
|
for (NSUInteger i = 0;i < argumentCount;++i) {
|
|
const char *argType = [self getArgumentTypeAtIndex:i];
|
|
|
|
size_t currentLength = strlen(encoding);
|
|
strlcpy(encoding + currentLength, argType, stringLength - currentLength);
|
|
}
|
|
|
|
// create an unused NSData object to autorelease the allocated string
|
|
[NSData dataWithBytesNoCopy:encoding length:stringLength + 1 freeWhenDone:YES];
|
|
|
|
return encoding;
|
|
}
|
|
@end
|