! * \brief sarrayToStringRange() * * \param[in] sa string array * \param[in] first index of first string to use; starts with 0 * \param[in] nstrings number of strings to append into the result; use * 0 to append to the end of the sarray * \param[in] addnlflag flag: 0 adds nothing to each substring * 1 adds '\n' to each substring
| 796 | * </pre> |
| 797 | */ |
| 798 | char * |
| 799 | sarrayToStringRange(SARRAY *sa, |
| 800 | l_int32 first, |
| 801 | l_int32 nstrings, |
| 802 | l_int32 addnlflag) |
| 803 | { |
| 804 | char *dest, *src, *str; |
| 805 | l_int32 n, i, last, size, index, len; |
| 806 | |
| 807 | PROCNAME("sarrayToStringRange"); |
| 808 | |
| 809 | if (!sa) |
| 810 | return (char *)ERROR_PTR("sa not defined", procName, NULL); |
| 811 | if (addnlflag != 0 && addnlflag != 1 && addnlflag != 2) |
| 812 | return (char *)ERROR_PTR("invalid addnlflag", procName, NULL); |
| 813 | |
| 814 | n = sarrayGetCount(sa); |
| 815 | |
| 816 | /* Empty sa; return char corresponding to addnlflag only */ |
| 817 | if (n == 0) { |
| 818 | if (first == 0) { |
| 819 | if (addnlflag == 0) |
| 820 | return stringNew(""); |
| 821 | if (addnlflag == 1) |
| 822 | return stringNew("\n"); |
| 823 | else /* addnlflag == 2) */ |
| 824 | return stringNew(" "); |
| 825 | } else { |
| 826 | return (char *)ERROR_PTR("first not valid", procName, NULL); |
| 827 | } |
| 828 | } |
| 829 | |
| 830 | if (first < 0 || first >= n) |
| 831 | return (char *)ERROR_PTR("first not valid", procName, NULL); |
| 832 | if (nstrings == 0 || (nstrings > n - first)) |
| 833 | nstrings = n - first; /* no overflow */ |
| 834 | last = first + nstrings - 1; |
| 835 | |
| 836 | size = 0; |
| 837 | for (i = first; i <= last; i++) { |
| 838 | if ((str = sarrayGetString(sa, i, L_NOCOPY)) == NULL) |
| 839 | return (char *)ERROR_PTR("str not found", procName, NULL); |
| 840 | size += strlen(str) + 2; |
| 841 | } |
| 842 | |
| 843 | if ((dest = (char *)LEPT_CALLOC(size + 1, sizeof(char))) == NULL) |
| 844 | return (char *)ERROR_PTR("dest not made", procName, NULL); |
| 845 | |
| 846 | index = 0; |
| 847 | for (i = first; i <= last; i++) { |
| 848 | src = sarrayGetString(sa, i, L_NOCOPY); |
| 849 | len = strlen(src); |
| 850 | memcpy(dest + index, src, len); |
| 851 | index += len; |
| 852 | if (addnlflag == 1) { |
| 853 | dest[index] = '\n'; |
| 854 | index++; |
| 855 | } else if (addnlflag == 2) { |
no test coverage detected