Changeset 5742:c2540f169bdf in roaraudio
- Timestamp:
- 11/09/12 20:01:03 (11 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
include/libroar/vio_dstr.h
r5388 r5742 181 181 }; 182 182 183 struct roar_vio_dstr_pathelement { 184 const char * dstr; 185 int flags; 186 }; 187 188 // PEF = Path Element Flag 189 #define ROAR_VIO_DSTR_PEF_NONE 0x0000 190 #define ROAR_VIO_DSTR_PEF_IS_DIR 0x0001 191 #define ROAR_VIO_DSTR_PEF_ALLOW_MULTI 0x0100 192 #define ROAR_VIO_DSTR_PEF_ALLOW_PARENT 0x0200 193 183 194 int roar_vio_dstr_get_type(const char * str); 184 195 const char * roar_vio_dstr_get_name(const int type); … … 208 219 int roar_vio_dstr_build_chain(struct roar_vio_dstr_chain * chain, struct roar_vio_calls * calls, struct roar_vio_calls * vio); 209 220 221 char * roar_vio_dstr_cat(char * buffer, ssize_t bufferlen, const struct roar_vio_dstr_pathelement * elements, size_t elementslen); 222 210 223 #endif 211 224 -
libroar/vio_dstr.c
r5651 r5742 999 999 1000 1000 #undef _ret 1001 1002 static inline ssize_t __libroar_dir_part_len(char * p, size_t len) { 1003 ssize_t i, c; 1004 1005 c = -1; 1006 1007 for (i = 0; i < len; i++, p++) 1008 if ( *p == '/' ) 1009 c = i; 1010 1011 return c; 1012 } 1013 1014 char * roar_vio_dstr_cat(char * buffer, ssize_t bufferlen, const struct roar_vio_dstr_pathelement * elements, size_t elementslen) { 1015 size_t needed = 0; 1016 size_t rootelement = 0; 1017 ssize_t ret; 1018 char * p; 1019 size_t i; 1020 1021 if ( buffer == NULL ) 1022 bufferlen = -1; 1023 1024 if ( elementslen == 0 ) { 1025 if ( bufferlen == -1 ) { 1026 if ( (buffer = roar_mm_malloc(2)) == NULL ) 1027 return NULL; 1028 bufferlen = 2; 1029 } 1030 1031 if ( bufferlen >= 2 ) { 1032 buffer[0] = '.'; 1033 buffer[1] = 0; 1034 return buffer; 1035 } else { 1036 roar_err_set(ROAR_ERROR_NOSPC); 1037 return NULL; 1038 } 1039 } 1040 1041 if ( elements == NULL ) { 1042 roar_err_set(ROAR_ERROR_FAULT); 1043 return NULL; 1044 } 1045 1046 for (i = 0; i < elementslen; i++) { 1047 if ( elements[i].dstr == NULL ) { 1048 roar_err_set(ROAR_ERROR_FAULT); 1049 return NULL; 1050 } 1051 1052 if ( !(elements[i].flags & ROAR_VIO_DSTR_PEF_ALLOW_MULTI) && strstr(elements[i].dstr, "##") != NULL ) { 1053 roar_err_set(ROAR_ERROR_INVAL); 1054 return NULL; 1055 } 1056 1057 if ( !(elements[i].flags & ROAR_VIO_DSTR_PEF_ALLOW_PARENT) && strstr(elements[i].dstr, "..") != NULL ) { 1058 roar_err_set(ROAR_ERROR_INVAL); 1059 return NULL; 1060 } 1061 1062 if ( strstr(elements[i].dstr, "##") != NULL ) { 1063 roar_err_set(ROAR_ERROR_NOTSUP); 1064 return NULL; 1065 } 1066 1067 if ( strstr(elements[i].dstr, ":") != NULL ) { 1068 rootelement = i; 1069 needed = 0; 1070 } 1071 1072 needed += roar_mm_strlen(elements[i].dstr); 1073 } 1074 1075 elements += rootelement; 1076 elementslen -= rootelement; 1077 1078 if ( elementslen == 1 ) { 1079 if ( bufferlen == -1 ) { 1080 bufferlen = needed+1; 1081 if ( (buffer = roar_mm_malloc(bufferlen)) == NULL ) 1082 return NULL; 1083 } 1084 1085 if ( bufferlen >= (elementslen + 1) ) { 1086 memcpy(buffer, elements[0].dstr, needed+1); 1087 return buffer; 1088 } else { 1089 roar_err_set(ROAR_ERROR_NOSPC); 1090 return NULL; 1091 } 1092 } 1093 1094 needed += elementslen * 2; // for '.', '/' and '\0'. 1095 1096 if ( bufferlen == -1 ) { 1097 bufferlen = needed; 1098 if ( (buffer = roar_mm_malloc(bufferlen)) == NULL ) 1099 return NULL; 1100 } 1101 1102 if ( bufferlen < needed ) { 1103 roar_err_set(ROAR_ERROR_NOSPC); 1104 return NULL; 1105 } 1106 1107 p = buffer; 1108 for (i = 0; i < elementslen; i++) { 1109 ret = roar_mm_strlen(elements[i].dstr); 1110 memcpy(p, elements[i].dstr, ret); 1111 if ( i == (elementslen-1) || elements[i].flags & ROAR_VIO_DSTR_PEF_IS_DIR ) { 1112 p += ret; 1113 } else { 1114 ret = __libroar_dir_part_len(p, ret); 1115 if ( ret == -1 ) { 1116 *p = '.'; 1117 p++; 1118 } else { 1119 p += ret; 1120 } 1121 } 1122 1123 *p = '/'; 1124 p++; 1125 } 1126 1127 p--; 1128 *p = 0; 1129 return buffer; 1130 } 1001 1131 #endif 1002 1132
Note: See TracChangeset
for help on using the changeset viewer.