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