-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtext_justification.c
114 lines (101 loc) · 2.7 KB
/
text_justification.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#define printf
static char *g_ret[100];
void fill_words(char *target, char **begin, int sum_words, int space, int extern_space, int max_len)
{
int i, j;
int target_len = 0;
for (i = 0; i < sum_words - 1; i++) {
int len = strlen(begin[i]);
memcpy(&target[target_len], begin[i], len);
target_len += len;
for (j = 0; j < space; j++) {
target[target_len] = ' ';
++target_len;
}
if (extern_space) {
target[target_len] = ' ';
++target_len;
--extern_space;
}
}
int len = strlen(begin[i]);
memcpy(&target[target_len], begin[i], len);
target_len += len;
for (i = target_len; i < max_len; i++) {
target[target_len] = ' ';
++target_len;
}
target[target_len] = '\0';
}
/**
* * Return an array of size *returnSize.
* * Note: The returned array must be malloced, assume caller calls free().
* */
char** fullJustify(char** words, int wordsSize, int maxWidth, int* returnSize) {
int i;
char **begin;
*returnSize = 0;
int sum_words_len = 0;
int sum_words = 0;
begin = &words[0];
for (i = 0; i < wordsSize; ++i) {
int len = strlen(words[i]);
sum_words_len += len;
++sum_words;
if (sum_words_len + sum_words - 1 > maxWidth) {
sum_words_len -= len;
--sum_words;
int space, extern_space;
if (sum_words <= 1) {
space = 0;
extern_space = 0;
} else if (sum_words == 2) {
space = 1;
extern_space = 0;
} else {
space = (maxWidth - sum_words_len) / (sum_words - 1);
extern_space = (maxWidth - sum_words_len) % (sum_words - 1);
}
printf("sum_word_len[%d] sum_words[%d] space[%d] extern_space[%d]\n", sum_words_len, sum_words, space, extern_space);
g_ret[*returnSize] = malloc(maxWidth);
fill_words(g_ret[*returnSize], begin, sum_words, space, extern_space, maxWidth);
sum_words_len = 0;
sum_words = 0;
begin = &words[i];
++(*returnSize);
--i;
}
}
g_ret[*returnSize] = malloc(maxWidth);
int space, extern_space;
if (sum_words <= 1) {
space = 0;
extern_space = 0;
} else if (sum_words == 2) {
space = 1;
extern_space = 0;
} else {
space = (maxWidth - sum_words_len) / (sum_words - 1);
extern_space = (maxWidth - sum_words_len) % (sum_words - 1);
}
printf("sum_word_len[%d] sum_words[%d] space[%d] extern_space[%d]\n", sum_words_len, sum_words, space, extern_space);
fill_words(g_ret[*returnSize], begin, sum_words, space, extern_space, maxWidth);
++(*returnSize);
return g_ret;
}
int main(int argc, char *argv[])
{
int size;
int maxWidth = atoi(argv[1]);
char **ret = fullJustify(&argv[2], argc - 2, maxWidth, &size);
int i;
printf("[");
for (i = 0; i < size; ++i) {
printf("\"%s\",", ret[i]);
}
printf("]\n");
return 0;
}