#import <Foundation/Foundation.h>

/* The following stolen from gdb.obj/myclass.m, written by Adam Fedor */

@interface MyClass: NSObject
{
  id object;
  id _object2;
}
+ newWithArg: arg;
- takeArg: arg;
- randomFunc;
@end

@implementation MyClass
+ newWithArg: arg
{
  if (self) {
    id obj = [self new];
    [obj takeArg: arg];
    return obj;
  }
  return (id)self;
}

- takeArg: arg
{
  object = arg;
  [object retain];
  _object2 = arg;
  [_object2 retain];
  return self;
}

- randomFunc
{
  puts ("hi");  /* Whatever, just a place to break and examine SELF in gdb */
}

@end

/* End of stolen code from gdb.obj/myclass.m, written by Adam Fedor */

@interface MyChild: MyClass
{
  int some_val;
}
+ newWithArg: arg andInt: (int) val;
- setValue: (int) val;
@end

@implementation MyChild
- (id) init {
  self = [super init];
  if (self) {
    printf ("Doing my initialization\n");
  }
  return self;
}

+ newWithArg: arg andInt: (int) val
{
  MyChild *me = [self new];
  [me takeArg: arg];
  [me setValue: val];
  return (id) me;
}

- setValue: (int) val
{
  some_val = val;
}
@end

void stringmaker (void);
int blocky (void);
int return_5 (void);
NSNumber *return_nsnumber_5 (void);
NSNumber *return_nsnumber_from_int (int);
NSNumber *return_nsnumber_from_char (char);

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  // First line in main ()
    id object = [MyClass newWithArg:@"hi there"];    

    NSString *a = @"hi there";

    [object randomFunc];

    [object release];

    object = [MyChild newWithArg:@"Hi again" andInt: 5];

    [object randomFunc];
    
    stringmaker ();

    blocky ();

    [pool release];
    return 0;
}

void stringmaker (void) {
    NSString *mystr = @"Hello, World!"; /* this should be the first line in stringmaker */

    NSLog (@"%@", mystr);
}

int return_5 (void ) { return 5; }

NSNumber *return_nsnumber_5 (void ) { return [NSNumber numberWithInt:5]; }

NSNumber *return_nsnumber_from_int (int num) 
     { return [NSNumber numberWithInt:num]; }

NSNumber *return_nsnumber_from_char (char num) 
     { return [NSNumber numberWithChar:num]; }
int outer = 15; /* for testing -var-create scoping regarding globals */
int blocky (void) {
  int outer;
  outer = 5;
  { 
    char inner1;
    inner1 = 'a';
    inner1 = 'b';
    inner1 = 'c';
    int inner2;
    inner2 = 99;

    {
      int outer;  /* psych! */
      outer = 10;
    }

    {
      float flooooo = 10.3;
      char chhhhh = 'Z';
    }
  }
  return 0;
}

/* This is here just to make sure that in -gused mode we
   still have the def'n of NSArray, since we use it in the po tests.  */
unsigned int 
define_NS_Types ()
{
  NSProcessInfo *pInfo = [NSProcessInfo processInfo];
  NSArray *fakeArray = [NSArray arrayWithObject: [pInfo processName]];
  NSMutableDictionary *fakeDict = 
             [NSMutableDictionary dictionaryWithObject:@"55" forKey:@"CANREADTHIS"];
  return [fakeArray count] * [fakeDict count];
}
