src/MulleScionPrintingException.m
2995f4ad
 //
27dc2200
 //  MulleScionPrintingException.m
d2f30cd2
 //  MulleScion
2995f4ad
 //
 //  Created by Nat! on 27.02.13.
 //
ef82839d
 //  Copyright (c) 2013 Nat! - Mulle kybernetiK
 //  All rights reserved.
 //
 //  Redistribution and use in source and binary forms, with or without
 //  modification, are permitted provided that the following conditions are met:
 //
 //  Redistributions of source code must retain the above copyright notice, this
 //  list of conditions and the following disclaimer.
 //
 //  Redistributions in binary form must reproduce the above copyright notice,
 //  this list of conditions and the following disclaimer in the documentation
 //  and/or other materials provided with the distribution.
 //
 //  Neither the name of Mulle kybernetiK nor the names of its contributors
 //  may be used to endorse or promote products derived from this software
 //  without specific prior written permission.
 //
 //  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 //  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 //  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 //  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 //  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 //  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 //  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 //  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 //  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 //  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 //  POSSIBILITY OF SUCH DAMAGE.
 //
2995f4ad
 #import "MulleScionPrintingException.h"
 
 #import "MulleScionObjectModel+Printing.h"
801f8317
 #import "MulleScionNull.h"
2995f4ad
 
 
801f8317
 void  MULLE_NO_RETURN   MulleScionPrintingException( NSString *exceptionName, NSDictionary *locals, NSString *format, ...)
2995f4ad
 {
801f8317
    va_list        args;
    NSString       *s;
 
    NSCParameterAssert( [exceptionName isKindOfClass:[NSString class]]);
    NSCParameterAssert( [locals isKindOfClass:[NSDictionary class]]);
    NSCParameterAssert( [format isKindOfClass:[NSString class]]);
2995f4ad
    
    va_start( args, format);
bdb5913e
    
1ae081f1
 #ifdef __MULLE_OBJC__
bdb5913e
    s = [[[NSString alloc] initWithFormat:format
27dc2200
                               varargList:args] autorelease];
bdb5913e
 #else
2995f4ad
    s = [[[NSString alloc] initWithFormat:format
                                arguments:args] autorelease];
bdb5913e
 #endif
2995f4ad
    
    va_end( args);
    
    [NSException raise:exceptionName
                format:@"%@ %@: %@",
     [locals valueForKey:MulleScionCurrentFileKey],
     [locals valueForKey:MulleScionCurrentLineKey],
     s];
801f8317
    abort();
2995f4ad
 }
 
 
801f8317
 void  MulleScionPrintingValidateArgumentCount( NSArray *arguments, NSUInteger n,  NSDictionary *locals)
2995f4ad
 {
07d4a6c3
    NSUInteger   count;
    
    count = [arguments count];
    if( count == n)
2995f4ad
       return;
    
801f8317
    MulleScionPrintingException( NSInvalidArgumentException, locals,
07d4a6c3
                                @"%@ expects %ld arguments (got %ld)",
801f8317
                                [locals valueForKey:MulleScionCurrentFunctionKey],
                                (long) n,
07d4a6c3
                                (long) count,
801f8317
                                locals);
2995f4ad
 }
 
 
801f8317
 id   MulleScionPrintingValidatedArgument( NSArray *arguments, NSUInteger i,  Class cls, NSDictionary *locals)
2995f4ad
 {
    id   value;
    
    value = [arguments objectAtIndex:i];
801f8317
    if( value == MulleScionNull)
       return( nil);
    
    if( ! cls || [value isKindOfClass:cls])
2995f4ad
       return( value);
    
801f8317
    MulleScionPrintingException( NSInvalidArgumentException, locals,
                                @"%@ expects a %@ as argument #%ld",
                                [locals valueForKey:MulleScionCurrentFunctionKey],
                                cls,
                                (long) i);
2995f4ad
 }