inz0 Posted October 21, 2004 Share Posted October 21, 2004 This function immitates php's substr function, but is written in c. I'm trying to shorten it, any ideas? /* ?Copies substring of string str from offset in str (+ from beginning/-from end) ?and length chars long into string substr. ?Returns TRUE if copy was success. */ int PHP_substr(char* str, char* substr, int offset, int length) { ? int s_length = strlen(str); ? if((str != 0) && (length > 0)) ? { ? ? ?if(offset >= 0) ? ? ?{ ? ? ? ? if((length - offset) >= s_length) ? ? ? ? { ? ? ? ? ? ?length = s_length - offset; ? ? ? ? } ? ? ?} ? ? ?else ? ? ?{ ? ? ? ? if((length - (s_length + offset)) >= (s_length + offset)) ? ? ? ? { ? ? ? ? ? ?length = s_length - (s_length + offset); ? ? ? ? } ? ? ? ? offset = s_length + offset; ? ? ?} ? ? ?if((offset >= 0) && ((s_length - 1) >= offset) && ? ? ? ? (s_length >= (offset + length))) ? ? ?{ ? ? ? ? strncpy(substr, str + offset, length); ? ? ? ? substr[length] = '\0'; ? ? ? ? return 1; ? ? ?} ? ? ?else if((offset < 0) && (s_length >= (offset * -1)) && ? ? ? ? ? ? ?(s_length >= ((s_length + offset) + length))) ? ? ?{ ? ? ? ? strncpy(substr, str + (s_length + offset), length); ? ? ? ? substr[length] = '\0'; ? ? ? ? return 1; ? ? ?} ? } ? else if((str != 0) && (length < 0)) ? { ? ? ?if(offset < 0) ? ? ?{ ? ? ? ? offset = s_length + offset; ? ? ?} ? ? ?if((offset >= 0) && ((s_length - 1) >= offset) && ? ? ? ? (s_length > (length * -1)) && ? ? ? ? ((s_length + length) > offset) && ? ? ? ? (s_length >= ((s_length + length) - offset))) ? ? ?{ ? ? ? ? strncpy(substr, str + offset, ((s_length + length) - offset)); ? ? ? ? substr[((s_length + length) - offset)] = '\0'; ? ? ? ? return 1; ? ? ?} ? } ? substr[0] = '\0'; ? return 0; } Link to comment Share on other sites More sharing options...
0 John Veteran Posted October 21, 2004 Veteran Share Posted October 21, 2004 Title edited Link to comment Share on other sites More sharing options...
0 inz0 Posted October 21, 2004 Author Share Posted October 21, 2004 at least the substr_compare is short int PHP_substr_compare(char* str1, char* str2, int offset, int length) { char *substr; substr = (strlen(str1) > strlen(str2)) ? ((char *) malloc(strlen(str1) + 1)) : ((char *) malloc(strlen(str2) + 1)); PHP_substr(str1, substr, offset, length); return strcmp(substr, str2); } Link to comment Share on other sites More sharing options...
Question
inz0
This function immitates php's substr function, but is written in c. I'm trying to shorten it, any ideas?
/* ?Copies substring of string str from offset in str (+ from beginning/-from end) ?and length chars long into string substr. ?Returns TRUE if copy was success. */ int PHP_substr(char* str, char* substr, int offset, int length) { ? int s_length = strlen(str); ? if((str != 0) && (length > 0)) ? { ? ? ?if(offset >= 0) ? ? ?{ ? ? ? ? if((length - offset) >= s_length) ? ? ? ? { ? ? ? ? ? ?length = s_length - offset; ? ? ? ? } ? ? ?} ? ? ?else ? ? ?{ ? ? ? ? if((length - (s_length + offset)) >= (s_length + offset)) ? ? ? ? { ? ? ? ? ? ?length = s_length - (s_length + offset); ? ? ? ? } ? ? ? ? offset = s_length + offset; ? ? ?} ? ? ?if((offset >= 0) && ((s_length - 1) >= offset) && ? ? ? ? (s_length >= (offset + length))) ? ? ?{ ? ? ? ? strncpy(substr, str + offset, length); ? ? ? ? substr[length] = '\0'; ? ? ? ? return 1; ? ? ?} ? ? ?else if((offset < 0) && (s_length >= (offset * -1)) && ? ? ? ? ? ? ?(s_length >= ((s_length + offset) + length))) ? ? ?{ ? ? ? ? strncpy(substr, str + (s_length + offset), length); ? ? ? ? substr[length] = '\0'; ? ? ? ? return 1; ? ? ?} ? } ? else if((str != 0) && (length < 0)) ? { ? ? ?if(offset < 0) ? ? ?{ ? ? ? ? offset = s_length + offset; ? ? ?} ? ? ?if((offset >= 0) && ((s_length - 1) >= offset) && ? ? ? ? (s_length > (length * -1)) && ? ? ? ? ((s_length + length) > offset) && ? ? ? ? (s_length >= ((s_length + length) - offset))) ? ? ?{ ? ? ? ? strncpy(substr, str + offset, ((s_length + length) - offset)); ? ? ? ? substr[((s_length + length) - offset)] = '\0'; ? ? ? ? return 1; ? ? ?} ? } ? substr[0] = '\0'; ? return 0; }Link to comment
Share on other sites
2 answers to this question
Recommended Posts