File tree Expand file tree Collapse file tree 2 files changed +55
-0
lines changed
Expand file tree Collapse file tree 2 files changed +55
-0
lines changed Original file line number Diff line number Diff line change 1+ #include "diamond.h"
2+
3+ #include <stddef.h>
4+ #include <stdlib.h>
5+ #include <string.h>
6+
7+ char * * make_diamond (const char letter ) {
8+ if (letter > 'Z' || letter < 'A' ) {
9+ return NULL ;
10+ }
11+ int axis_len = letter - 'A' ;
12+ int line_count = axis_len * 2 + 1 ;
13+ char * * diamond = malloc (line_count * sizeof (char * ));
14+ if (diamond == NULL ) {
15+ return NULL ;
16+ }
17+ for (int i = 0 ; i < line_count ; i ++ ) {
18+ diamond [i ] = malloc (sizeof (char [line_count ]));
19+ if (diamond [i ] == NULL ) {
20+ for (int j = 0 ; j < i ; j ++ ) {
21+ free (diamond [j ]);
22+ free (diamond );
23+ return NULL ;
24+ }
25+ }
26+ for (int j = 0 ; j < line_count ; j ++ ) {
27+ char temp_letter = 'A' + i > letter ? 2 * letter - 'A' - i : 'A' + i ;
28+ int l1 = ((i + j ) == axis_len );
29+ int l2 = ((i + j ) == 3 * axis_len );
30+ int l3 = ((i - j ) == axis_len );
31+ int l4 = ((j - i ) == axis_len );
32+ diamond [i ][j ] = l1 || l2 || l3 || l4 ? temp_letter : ' ' ;
33+ }
34+ diamond [i ][line_count ] = '\0' ;
35+ }
36+ return diamond ;
37+ }
38+
39+ void free_diamond (char * * diamond ) {
40+ if (diamond == NULL ) {
41+ return ;
42+ }
43+ size_t len = strlen (diamond [0 ]);
44+ for (size_t i = 0 ; i < len ; i ++ ) {
45+ free (diamond [i ]);
46+ }
47+ free (diamond );
48+ }
Original file line number Diff line number Diff line change 1+ #ifndef DIAMOND_H
2+ #define DIAMOND_H
3+
4+ char * * make_diamond (const char letter );
5+ void free_diamond (char * * diamond );
6+
7+ #endif
You can’t perform that action at this time.
0 commit comments