// // ParseDate.m // Pester // // Created by Nicholas Riley on 11/28/07. // Copyright 2007 Nicholas Riley. All rights reserved. // #import // generated by perl -MExtUtils::Embed -e xsinit -- -o perlxsi.c #include #include EXTERN_C void xs_init (pTHX); EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); EXTERN_C void xs_init(pTHX) { char *file = __FILE__; dXSUB_SYS; /* DynaLoader is a special case */ newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); } // end generated code static PerlInterpreter *my_perl; static NSDateFormatter *dateManipFormatter; NSDate *parse_natural_language_date(NSString *input) { if (my_perl == NULL) return nil; if ([input rangeOfString: @"|"].length > 0) { NSMutableString *sanitized = [[input mutableCopy] autorelease]; [sanitized replaceOccurrencesOfString: @"|" withString: @"" options: NSLiteralSearch range: NSMakeRange(0, [sanitized length])]; input = sanitized; } NSString *temp = [[NSString alloc] initWithFormat: @"my $s = eval {UnixDate(q|%@|, '%%q')}; warn $@ if $@; $s", input]; // NSLog(@"%@", temp); SV *d = eval_pv([temp UTF8String], FALSE); [temp release]; if (d == NULL) return nil; STRLEN s_len; char *s = SvPV(d, s_len); if (s == NULL || s_len == 0) return nil; NSDate *date = [dateManipFormatter dateFromString: [NSString stringWithUTF8String: s]]; // NSLog(@"%@", date); return date; } static void init_perl(void) { const char *argv[] = {"", "-CSD", "-I", "", "-MDate::Manip", "-e", "0"}; argv[3] = [[[NSBundle mainBundle] resourcePath] fileSystemRepresentation]; PERL_SYS_INIT(0, NULL); my_perl = perl_alloc(); if (my_perl == NULL) return; perl_construct(my_perl); if (perl_parse(my_perl, xs_init, 7, (char **)argv, NULL) != 0) goto fail; PL_exit_flags |= PERL_EXIT_DESTRUCT_END; if (perl_run(my_perl) != 0) goto fail; // XXX detect localization changes eval_pv("Date_Init(\"Language=English\", \"DateFormat=non-US\", \"Internal=1\"", TRUE); if (parse_natural_language_date(@"tomorrow") == nil) goto fail; return; fail: perl_destruct(my_perl); perl_free(my_perl); PERL_SYS_TERM(); my_perl = NULL; } // note: the documentation is misleading here, and this works. // void initialize(void) __attribute__((constructor)); void initialize(void) { dateManipFormatter = [[NSDateFormatter alloc] init]; [dateManipFormatter setDateFormat: @"yyyyMMddHHmmss"]; // Date::Manip's "%q" init_perl(); }