00001 #include <stdlib.h> 00002 #include "nmd.h" 00003 #include "nmd_impl.h" 00004 #include "string.h" 00005 00006 struct NMD_string_ { 00007 int cookie; 00008 int n; char *t; 00009 }; 00010 00011 #undef __FUNCT__ 00012 #define __FUNCT__ "NMDStringCreateOfSize" 00013 static NMDErrorCode NMDStringCreateOfSize(int n,NMD_string *r_str) 00014 { 00015 NMD_string str; char *t; 00016 NMD_MALLOC(t,n+1,char,"nmd string"); 00017 NMD_MALLOC(str,1,struct NMD_string_,"string object"); 00018 str->n = n; str->t = t; str->cookie = NMDCOOKIE; 00019 *r_str = str; 00020 return 0; 00021 } 00022 00023 #undef __FUNCT__ 00024 #define __FUNCT__ "NMDStringCreate" 00025 NMDErrorCode NMDStringCreate(char *txt,NMD_string *r_str) 00026 { 00027 NMD_string str; NMDErrorCode ierr; int l; 00028 l = strlen(txt); 00029 ierr = NMDStringCreateOfSize(l,&str); NMD_ERR_RETURN(ierr); 00030 memcpy(str->t,txt,l); 00031 *r_str = str; 00032 return 0; 00033 } 00034 00035 #undef __FUNCT__ 00036 #define __FUNCT__ "NMDStringDestroy" 00037 NMDErrorCode NMDStringDestroy(NMD_string str) 00038 { 00039 CHECKHASNMDCOOKIE(str); 00040 NMD_FREE(str->t); 00041 NMD_FREE(str); 00042 return 0; 00043 } 00044 00045 #undef __FUNCT__ 00046 #define __FUNCT__ "NMDStringGetString" 00047 NMDErrorCode NMDStringGetString(NMD_string str,char **t) 00048 { 00049 CHECKHASNMDCOOKIE(str); 00050 *t = str->t; 00051 return 0; 00052 } 00053 00054 #undef __FUNCT__ 00055 #define __FUNCT__ "NMDStringConcat" 00056 NMDErrorCode NMDStringConcat 00057 (char s1,NMD_string str1,char s2,NMD_string str2,char s3,NMD_string *r_str) 00058 { 00059 NMD_string str; NMDErrorCode ierr; int l; 00060 CHECKHASNMDCOOKIE(str1); 00061 00062 l = str1->n + ( str2 ? str2->n : 0 ) + (s1!=0) + (s2!=0) + (s3!=0); 00063 ierr = NMDStringCreateOfSize(l,&str); NMD_ERR_RETURN(ierr); 00064 00065 l = 0; 00066 if (s1) { 00067 if (l+1>str->n) NMD_ERR_REPORT("string overflow"); 00068 memcpy(str->t+l,&s1,1); 00069 } 00070 00071 l = strlen(str->t); 00072 if (l+str1->n>str->n) NMD_ERR_REPORT("string overflow"); 00073 memcpy(str->t+l,str1->t,str1->n); 00074 00075 if (s2) { 00076 CHECKHASNMDCOOKIE(str2); 00077 l = strlen(str->t); 00078 if (l+1>str->n) NMD_ERR_REPORT("string overflow"); 00079 memcpy(str->t+l,&s2,1); 00080 } 00081 00082 if (str2) { 00083 l = strlen(str->t); 00084 if (l+str2->n>str->n) NMD_ERR_REPORT("string overflow"); 00085 memcpy(str->t+l,str2->t,str2->n); 00086 } 00087 00088 if (s3) { 00089 l = strlen(str->t); 00090 if (l+1>str->n) NMD_ERR_REPORT("string overflow"); 00091 memcpy(str->t+l,&s3,1); 00092 } 00093 00094 *r_str = str; 00095 return 0; 00096 } 00097