Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!wuarchive!zaphod.mps.ohio-state.edu!uwm.edu!linac!mp.cs.niu.edu!ux1.cso.uiuc.edu!uxh.cso.uiuc.edu!unicorn From: unicorn@uxh.cso.uiuc.edu (Harry E Miller) Newsgroups: comp.lang.c Subject: Info Hiding in C Summary: Hiding structures in C Keywords: Hiding Message-ID: <1991Apr17.004044.22940@ux1.cso.uiuc.edu> Date: 17 Apr 91 00:40:44 GMT Sender: usenet@ux1.cso.uiuc.edu (News) Organization: University of Illinois at Urbana Lines: 163 Hi there, I started learning C++ and one of the most interesting things about it is information hiding. For my project at work, I am developing a dynamically allocated string library, that will eventually incorporate expanded memory. (I'm working with Turbo C++ in C mode.) I wish to include optional information hiding within this library, so that the programer can only get string information from a function (not a macro!). I've tested the following three files, and they seem to work. They compile without complaint with all warning flags on. I would like any comments (flames if this is just crap) on this way of (optionally) hiding the string structure. Also why won't this work? typedef void String[6]; The compiler gives me a "Not an allowed type" error. I just made a fool of myself debugging a FORTRAN program (uch!!!) with a distinguished colleague (sp?), so go ahead and flame away if you wish! Please e-mail this to me. Harry Miller aka "The Four-Fingered Bandit" unicorn@uxh.cso.uiuc.edu - lots of u's running around these hills You can tell how far we have to go, when FORTRAN is the language of supercomputers. -- Steven Feiner /* ------------------- cut here for file unicstr.h --------------- */ /* file unicstr.h */ #ifdef INFO_HIDING /* programmer can hide the structure String so that he has to use functions to access the data */ /* typedef void String[6]; will not work! why? */ typedef char String[6]; /* Hidden string */ #else /* ------------------------------------- */ typedef struct _string { /* 0x00 | string structure */ char *str; /* 0x02 | pointer to the char array */ unsigned length; /* 0x04 | current length of str */ unsigned alloc; /* 0x06 | amount allocated to str */ } _String; /* 0x07 | end of _string structure */ /* ------------------------------------- */ typedef _String String; #endif /* alloc and dealloc prototypes */ String *StrAlloc(char *str, unsigned amount); void StrDealloc(String *str); /* get info prototypes */ char *get_str(const String *str); unsigned get_len(const String *str); unsigned get_alloc(const String *str); /* ------------------- cut here for file unicstr.c --------------- */ /* file unicstr.c */ #ifdef INFO_HIDING #undef INFO_HIDING #endif #include #include #include "unicstr.h" String *StrAlloc(char *strptr, unsigned amount) { String *s; unsigned len; len = strlen(strptr); if ((s = (String *) malloc(sizeof(String))) == NULL) return (NULL); if (amount < len) /* will allocate at least enough */ amount = len+1; /* for the string to fit into */ if ((s->str = (char *) malloc(amount)) == NULL) return (NULL); strcpy(s->str,strptr); s->length = len; s->alloc = amount; return (s); } void StrDealloc(String *str) { free(str->str); free(str); } char *get_str(const String *str) { return (str->str); } unsigned get_len(const String *str) { return (str->length); } unsigned get_alloc(const String *str) { return (str->alloc); } /* ----------------- cut here for file test.c -------------------- */ /* file test.c */ #define INFO_HIDING #include #include "unicstr.h" void main() { String *s1, *s2; s1 = StrAlloc("This is test 1", 20); s2 = StrAlloc("This is test 2", 10); printf(" %s\n length = %u\n allocated amount = %u\n", get_str(s1), get_len(s1), get_alloc(s1)); printf(" %s\n length = %u\n allocated amount = %u\n", get_str(s2), get_len(s2), get_alloc(s2)); StrDealloc(s1); StrDealloc(s2); }