This is slclass.c in view mode; [Download] [Up]
/* User defined objects */ /* Copyright (c) 1992, 1995 John E. Davis * All rights reserved. * * You may distribute under the terms of either the GNU General Public * License or the Perl Artistic License. */ #include "config.h" #include <stdio.h> #include "slang.h" #include "_slang.h" SLang_Class_Type *SLang_Registered_Types[256]; static void default_destroy (long *unused) { #ifdef msdos (void) unused; #endif } int SLang_register_class (unsigned char sub_type, FVOID_STAR dest, FVOID_STAR string) { SLang_Class_Type *cl; cl = SLang_Registered_Types[sub_type]; if (cl != NULL) return 0; cl = (SLang_Class_Type *) SLMALLOC (sizeof (SLang_Class_Type)); if (cl == NULL) return 0; SLMEMSET ((char *) cl, 0, sizeof (SLang_Class_Type)); if (dest == NULL) dest = (FVOID_STAR) default_destroy; cl->destroy = (void (*)(VOID_STAR)) dest; cl->string = (char *(*)(VOID_STAR)) string; SLang_Registered_Types[sub_type] = cl; return 1; } static void add_binary_op (SLang_Class_Type *cla, SL_OOBinary_Type *ba, unsigned char stb, FVOID_STAR fa) { SL_OOBinary_Type *tmp; ba->sub_type = stb; ba->binary_function = (int (*)_PROTO((int, unsigned char, unsigned char, VOID_STAR, VOID_STAR))) fa; ba->next = NULL; tmp = cla->binary_ops; if (tmp == NULL) cla->binary_ops = ba; else { while (tmp->next != NULL) tmp = tmp->next; tmp->next = ba; } } int SLang_add_binary_op (unsigned char sta, unsigned char stb, FVOID_STAR f) { SLang_Class_Type *cla, *clb; SL_OOBinary_Type *ba = NULL, *bb = NULL; cla = SLang_Registered_Types [sta]; clb = SLang_Registered_Types [stb]; if ((cla == NULL) || (clb == NULL)) return 0; if ((NULL == (ba = (SL_OOBinary_Type *) SLMALLOC (sizeof(SL_OOBinary_Type)))) || (NULL == (bb = (SL_OOBinary_Type *) SLMALLOC (sizeof(SL_OOBinary_Type))))) { goto malloc_error_return; } add_binary_op (cla, ba, stb, f); add_binary_op (clb, bb, sta, f); return 1; /* Malloc errors go here */ malloc_error_return: if (ba != NULL) SLFREE (ba); if (bb != NULL) SLFREE (bb); return 0; } int SLang_add_unary_op (unsigned char st, FVOID_STAR f) { SLang_Class_Type *cl; cl = SLang_Registered_Types[st]; if (cl == NULL) return 0; cl->unary_function = (int (*)_PROTO((int, unsigned char, VOID_STAR))) f; return 1; } int SLang_add_copy_operation (unsigned char st, FVOID_STAR f) { SLang_Class_Type *cl; cl = SLang_Registered_Types[st]; if (cl == NULL) return 0; cl->copy_function = (int (*)_PROTO((unsigned char, VOID_STAR))) f; return 1; } SLuser_Object_Type *SLang_create_user_object (unsigned char t) { SLuser_Object_Type *u; if (t < ARRAY_TYPE) return NULL; /* See if it is registered. */ if (SLang_Registered_Types[t] == NULL) { SLang_doerror ("Type not registered."); return NULL; } if (NULL == (u = (SLuser_Object_Type *) SLMALLOC (sizeof (SLuser_Object_Type)))) { SLang_Error = SL_MALLOC_ERROR; return NULL; } u->sub_type = t; u->main_type = SLANG_DATA; u->count = 0; return u; } void SLang_free_user_object (SLuser_Object_Type *obj) { unsigned char type; if (obj->main_type == SLANG_DATA) { obj->count -= 1; if (obj->count == 0) { type = obj->sub_type; (*(SLang_Registered_Types[type]->destroy)) ((VOID_STAR) obj->obj); SLFREE (obj); } } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.