const unsigned int MAX_N = 1000;

unsigned int c_strlen(const char* s) {
	unsigned int i = 0;
	for (; *s; s++) i++;
	return i;
}

unsigned int less_than(const char *s1, const char* s2) {
	for(; *s1 == *s2 && *s1; s1++) s2++;
	return (*s1 < *s2);
}

void insertion_sort(const char* strs[], unsigned int n) {
	for (unsigned int i = 0; i < n-1; i++) {
		for (unsigned int j = i+1; j > 0; j--) {
			if (less_than(strs[j], strs[j-1])) {
				const char* tmp = strs[j-1];
				strs[j-1] = strs[j];
				strs[j] = tmp;
			} else {
				break;
			}
		}
	}
}

void sort_strings(const char* input, char* output, unsigned int n) {
	const char* strings[MAX_N];
	unsigned int i = 0;
	unsigned int offset = 0;
	for (i = 0; i < n; i++) {
		strings[i] = input + offset;
		offset += c_strlen(input + offset) + 1; // + 1 for NUL
	}

	insertion_sort(strings, n);

	offset = 0;
	for (i = 0; i < n; i++) {
		const unsigned int len = c_strlen(strings[i]);
		for (unsigned int j = 0; j <= len; j++) {
			output[offset + j] = strings[i][j];
		}
		offset += len + 1;
	}
}
