Changeset 5742:c2540f169bdf in roaraudio


Ignore:
Timestamp:
11/09/12 20:01:03 (11 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added function roar_vio_dstr_cat() used to concatinate filename/paths

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/vio_dstr.h

    r5388 r5742  
    181181}; 
    182182 
     183struct 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 
    183194int           roar_vio_dstr_get_type(const char * str); 
    184195const char *  roar_vio_dstr_get_name(const int type); 
     
    208219int     roar_vio_dstr_build_chain(struct roar_vio_dstr_chain * chain, struct roar_vio_calls * calls, struct roar_vio_calls * vio); 
    209220 
     221char *  roar_vio_dstr_cat(char * buffer, ssize_t bufferlen, const struct roar_vio_dstr_pathelement * elements, size_t elementslen); 
     222 
    210223#endif 
    211224 
  • libroar/vio_dstr.c

    r5651 r5742  
    999999 
    10001000#undef _ret 
     1001 
     1002static 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 
     1014char *  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} 
    10011131#endif 
    10021132 
Note: See TracChangeset for help on using the changeset viewer.