kString

@interface kString : kObject
{
@public
  string cString;
  uint length;
}

+ (kObj)new:(kString*)str, ...;
+ (kObj)new:(kString*)str :(kArgs)args;

- (kObj)initFormattedString:(kString*)str, ...;
- (kObj)initFormattedString:(kString*)str :(kArgs)args;

+ (kObj)newCString:(const_string)str, ...;
+ (kObj)newCString:(const_string)str :(kArgs)args;

- (kObj)initCString:(const_string)str;
- (kObj)initFormattedCString:(const_string)str, ...;
- (kObj)initFormattedCString:(const_string)str :(kArgs)args;

- (const_string)cString;

- (kNatural*)length;

@end
@implementation kString

+ (kObj)new:(kString*)str, ...
{
  va_list args;
  va_start(args, str);
  kString *s = [kString new:str :args];
  va_end(args);

  return s;
}

+ (kObj)new:(kString*)str :(kArgs)args
{
  return [[self alloc] initFormattedCString:[str cString] :args];
}

- (kObj)initFormattedString:(kString*)str, ...
{
  if(self = [super init])
  {
    cString = (string)malloc(255);

    va_list args;
    va_start(args, str);
    vsprintf(cString, [str cString], args);
    va_end(args);

    length = strlen(cString) + 1;
  }

  return self;
}

- (kObj)initFormattedString:(kString*)str :(kArgs)args
{
  if(self = [super init])
  {
    cString = (string)malloc(255);

    vsprintf(cString, [str cString], args);

    length = strlen(cString) + 1;
  }

  return self;
}

+ (kObj)newCString:(const_string)str, ...
{
  va_list args;
  va_start(args, str);
  kString *s = [[self alloc] initFormattedCString:str :args];
  va_end(args);

  return s;
}

+ (kObj)newCString:(const_string)str :(kArgs)args
{
  return [[self alloc] initFormattedCString:str :args];
}

- (kObj)initCString:(const_string)str
{
  if(self = [super init])
  {
    length = strlen(str) + 1;
    cString = (string)malloc(length);
    strcpy(cString, str);
  }

  return self;
}

- (kObj)initFormattedCString:(const_string)str, ...
{
  if(self = [super init])
  {
    cString = (string)malloc(255);

    va_list args;
    va_start(args, str);
    vsprintf(cString, str, args);
    va_end(args);

    length = strlen(cString) + 1;
  }

  return self;
}

- (kObj)initFormattedCString:(const_string)str :(kArgs)args
{
  if(self = [super init])
  {
    cString = (string)malloc(255);

    vsprintf(cString, str, args);

    length = strlen(cString) + 1;
  }

  return self;
}

- (const_string)cString
{
  return cString;
}

- (kNatural*)length
{
  return [kNatural new:length];
}

@end