trackler 2.0.0.5 → 2.0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/bash/docs/TESTS.md +1 -1
  4. data/tracks/bash/exercises/bob/bob_test.sh +2 -0
  5. data/tracks/bash/exercises/gigasecond/gigasecond_test.sh +2 -0
  6. data/tracks/bash/exercises/hamming/hamming_test.sh +2 -0
  7. data/tracks/bash/exercises/hello-world/hello_world_test.sh +2 -0
  8. data/tracks/bash/exercises/leap/leap_test.sh +2 -0
  9. data/tracks/bash/exercises/raindrops/raindrops_test.sh +2 -0
  10. data/tracks/bash/exercises/rna-transcription/rna_transcription_test.sh +2 -0
  11. data/tracks/c/bin/verify-indent +5 -1
  12. data/tracks/c/config.json +10 -1
  13. data/tracks/c/exercises/clock/src/clock.h +1 -1
  14. data/tracks/c/exercises/largest-series-product/test/test_largest_series_product.c +1 -1
  15. data/tracks/c/exercises/phone-number/src/example.c +4 -2
  16. data/tracks/c/exercises/roman-numerals/src/example.c +20 -21
  17. data/tracks/c/exercises/roman-numerals/src/example.h +1 -1
  18. data/tracks/c/exercises/roman-numerals/test/test_roman_numerals.c +1 -0
  19. data/tracks/c/exercises/sum-of-multiples/src/example.c +3 -1
  20. data/tracks/c/exercises/sum-of-multiples/src/example.h +3 -1
  21. data/tracks/c/exercises/sum-of-multiples/test/test_sum_of_multiples.c +44 -22
  22. data/tracks/c/exercises/word-count/makefile +16 -0
  23. data/tracks/c/exercises/word-count/src/example.c +65 -0
  24. data/tracks/c/exercises/word-count/src/word_count.h +22 -0
  25. data/tracks/c/exercises/word-count/test/test_word_count.c +372 -0
  26. data/tracks/c/exercises/word-count/test/vendor/unity.c +1300 -0
  27. data/tracks/c/exercises/word-count/test/vendor/unity.h +274 -0
  28. data/tracks/c/exercises/word-count/test/vendor/unity_internals.h +701 -0
  29. data/tracks/crystal/.gitignore +1 -0
  30. data/tracks/crystal/Makefile +6 -0
  31. data/tracks/crystal/README.md +25 -0
  32. data/tracks/crystal/config.json +10 -2
  33. data/tracks/crystal/exercises/acronym/spec/acronym_spec.cr +32 -0
  34. data/tracks/crystal/exercises/acronym/src/example.cr +7 -0
  35. data/tracks/crystal/exercises/hello-world/spec/hello_world_spec.cr +8 -10
  36. data/tracks/crystal/exercises/hello-world/src/example.cr +1 -1
  37. data/tracks/crystal/src/generator/exercises/acronym.cr +34 -0
  38. data/tracks/crystal/src/generator/exercises/exercise_generator.cr +39 -0
  39. data/tracks/crystal/src/generator/exercises/exercise_test_case.cr +8 -0
  40. data/tracks/crystal/src/generator/exercises/hello_world.cr +38 -0
  41. data/tracks/crystal/src/generator/exercises/templates/example.tt +10 -0
  42. data/tracks/crystal/src/generator/generate.cr +15 -0
  43. data/tracks/crystal/src/generator/spec/exercise_generator_spec.cr +27 -0
  44. data/tracks/crystal/src/generator/spec/exercise_test_case_spec.cr +23 -0
  45. data/tracks/elixir/exercises/space-age/space_age.exs +1 -1
  46. data/tracks/elm/config.json +5 -31
  47. data/tracks/elm/elm-package.json +1 -0
  48. data/tracks/elm/exercises/bob/BobTests.elm +1 -1
  49. data/tracks/elm/exercises/run-length-encoding/RunLengthEncoding.elm +5 -0
  50. data/tracks/elm/exercises/scrabble-score/ScrabbleScore.elm +1 -0
  51. data/tracks/elm/exercises/scrabble-score/ScrabbleScore.example +32 -0
  52. data/tracks/elm/exercises/scrabble-score/ScrabbleScoreTests.elm +43 -0
  53. data/tracks/elm/exercises/scrabble-score/elm-package.json +16 -0
  54. data/tracks/elm/exercises/scrabble-score/runtests.bat +1 -0
  55. data/tracks/elm/exercises/scrabble-score/runtests.sh +2 -0
  56. data/tracks/elm/exercises/sublist/Sublist.elm +5 -0
  57. data/tracks/fsharp/exercises/sum-of-multiples/SumOfMultiplesTest.fs +6 -1
  58. data/tracks/haskell/docs/LEARNING.md +11 -2
  59. data/tracks/haskell/exercises/list-ops/test/Tests.hs +2 -0
  60. data/tracks/java/config.json +13 -1
  61. data/tracks/java/exercises/etl/src/test/java/EtlTest.java +101 -55
  62. data/tracks/java/exercises/hello-world/TUTORIAL.md +1 -1
  63. data/tracks/java/exercises/largest-series-product/build.gradle +17 -0
  64. data/tracks/java/exercises/largest-series-product/src/example/java/LargestSeriesProductCalculator.java +56 -0
  65. data/tracks/java/exercises/largest-series-product/src/main/java/LargestSeriesProductCalculator.java +5 -0
  66. data/tracks/java/exercises/largest-series-product/src/test/java/LargestSeriesProductCalculatorTest.java +218 -0
  67. data/tracks/java/exercises/queen-attack/build.gradle +17 -0
  68. data/tracks/java/exercises/queen-attack/src/example/java/BoardCoordinate.java +39 -0
  69. data/tracks/java/exercises/queen-attack/src/example/java/QueenAttackCalculator.java +54 -0
  70. data/tracks/java/exercises/queen-attack/src/main/java/BoardCoordinate.java +5 -0
  71. data/tracks/java/exercises/queen-attack/src/main/java/QueenAttackCalculator.java +5 -0
  72. data/tracks/java/exercises/queen-attack/src/test/java/QueenAttackCalculatorTest.java +135 -0
  73. data/tracks/java/exercises/settings.gradle +2 -0
  74. data/tracks/ocaml/exercises/leap/test.ml +17 -6
  75. data/tracks/rust/_test/check-exercises.sh +5 -0
  76. data/tracks/swift/docs/TESTS.md +23 -3
  77. metadata +35 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0ad43d193656b92d10fd9344553cf30d66baae72
4
- data.tar.gz: fa8601209c89c67e01b4e8d3b797a3fc98271692
3
+ metadata.gz: fd26f913270ca0a9e000f69e94f05f446e3dbcf0
4
+ data.tar.gz: be8dca46c9162bd55189ae5840d5f9cce840cfa6
5
5
  SHA512:
6
- metadata.gz: ad7e2dba3130960687bf8c0dc7b4e0184e4d2951d10090d740af794de761d986e3c88aab193c5678627f9ed9908fe3bfea57c936c694f97c299896bbab2afcda
7
- data.tar.gz: b7b933be55c8174b41730383df120ddf5aabd607cf9ef38054ee222df76058d73b8a012249ec1915ce3d529a1d6131469ab7ec684f4c5c0b25fabdc57040babc
6
+ metadata.gz: 40227845c9e6200c10cd5f4eb6f1d7b78bfba7160b9adaafc804293f92b7b0fef3eae27f56c3c810b4ed2daf6761b29e32a6d5dfbf9e77f788d0355d2cc95b28
7
+ data.tar.gz: 944ef6f86d085ea5b0d20e1c048ac31bc95f54a38f99ce7f0f9cf6358de4c6cd8a2bb096fb4b00f64455441115432bf45819cea2b1d9f23dc8b76f98788929b4
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.0.0.5"
2
+ VERSION = "2.0.0.6"
3
3
  end
@@ -21,4 +21,4 @@ For Red Hat, Scientific Linux, and CentOS 6 or later bats is found in the EPEL r
21
21
  sudo yum install bats
22
22
  ```
23
23
 
24
- Run the tests with `bats whatever_test.sh`.
24
+ Run the tests with `bats whatever_test.sh` or `./whatever_test.sh`.
@@ -1,3 +1,5 @@
1
+ #!/usr/bin/env bats
2
+
1
3
  @test "stating something." {
2
4
  run bash bob.sh "Tom-ay-to, tom-aaaah-to."
3
5
 
@@ -1,3 +1,5 @@
1
+ #!/usr/bin/env bats
2
+
1
3
  @test 'April 25th, 2011' {
2
4
  run bash gigasecond.sh '2011-04-25Z'
3
5
 
@@ -1,3 +1,5 @@
1
+ #!/usr/bin/env bats
2
+
1
3
  @test "Short identical strands have hamming distance of zero" {
2
4
  run bash hamming.sh C C
3
5
 
@@ -1,3 +1,5 @@
1
+ #!/usr/bin/env bats
2
+
1
3
  @test "When given no name, it should greet the world!" {
2
4
  run bash hello_world.sh
3
5
 
@@ -1,3 +1,5 @@
1
+ #!/usr/bin/env bats
2
+
1
3
  @test "Leap year should return leap year" {
2
4
  run ./leap.sh 1996
3
5
 
@@ -1,3 +1,5 @@
1
+ #!/usr/bin/env bats
2
+
1
3
  # check non factors
2
4
 
3
5
  @test "Number 1, not factor of 3, 5 or 7, should output itself: 1." {
@@ -1,3 +1,5 @@
1
+ #!/usr/bin/env bats
2
+
1
3
  @test 'Complement of cytosine is guanine' {
2
4
  run bash rna_transcription.sh C
3
5
 
@@ -1,7 +1,11 @@
1
- #!/bin/sh
1
+ #!/bin/bash
2
2
 
3
3
  sh indent.sh
4
4
 
5
+ # This script fails when run by Travis if the diff is not checked twice
6
+ # Unfortunately no better solution was found
7
+ git diff --quiet
8
+
5
9
  if ! $(git diff --quiet)
6
10
  then
7
11
  echo "Incorrect style detected:"
data/tracks/c/config.json CHANGED
@@ -137,8 +137,17 @@
137
137
  "strings"
138
138
  ]
139
139
  }, {
140
- "slug": "allergies",
140
+ "difficulty": 3,
141
+ "slug": "word-count",
142
+ "topics": [
143
+ "strings",
144
+ "filtering",
145
+ "structs",
146
+ "memory management"
147
+ ]
148
+ }, {
141
149
  "difficulty": 4,
150
+ "slug": "allergies",
142
151
  "topics": [
143
152
  "control-flow (if-statements)",
144
153
  "control-flow (loops)",
@@ -1,7 +1,7 @@
1
1
  #ifndef _CLOCK_H
2
2
  #define _CLOCK_H
3
3
 
4
- #define MAX_STR_LEN (5 + 1) // "##:##\0"
4
+ #define MAX_STR_LEN (5 + 1) // "##:##\0"
5
5
 
6
6
  typedef char time_text_t[MAX_STR_LEN];
7
7
 
@@ -50,7 +50,7 @@ void test_can_get_the_largest_product_of_a_big_number_project_euler(void)
50
50
  TEST_ASSERT_EQUAL_INT64(23514624000,
51
51
  largest_series_product
52
52
  ("7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450",
53
- 13));
53
+ 13));
54
54
  }
55
55
 
56
56
  void test_reports_zero_if_the_only_digits_are_zero(void)
@@ -15,7 +15,8 @@
15
15
 
16
16
  #define INVALID_NUMBER_RESULT "0000000000"
17
17
 
18
- static void remove_leading_digit(char *phone_number) {
18
+ static void remove_leading_digit(char *phone_number)
19
+ {
19
20
  char *temp = calloc(VALID_NUMBER_LENGTH, sizeof(char));
20
21
  strcpy(temp, &phone_number[1]);
21
22
  strcpy(phone_number, temp);
@@ -58,7 +59,8 @@ char *phone_number_format(const char *input)
58
59
  char *cleaned_input = phone_number_clean(input);
59
60
  char *output = calloc(FORMATTED_LENGTH, sizeof(char));
60
61
 
61
- sprintf(output, "(%.3s) %.3s-%.4s", cleaned_input, &cleaned_input[AREA_CODE_LENGTH], &cleaned_input[EXTENSION_OFFSET]);
62
+ sprintf(output, "(%.3s) %.3s-%.4s", cleaned_input,
63
+ &cleaned_input[AREA_CODE_LENGTH], &cleaned_input[EXTENSION_OFFSET]);
62
64
 
63
65
  free(cleaned_input);
64
66
 
@@ -5,36 +5,35 @@
5
5
  #define NUM_OF_ELEMENTS(a) (sizeof(a) / sizeof(a[0]))
6
6
  #define MAX_NUMERAL_LENGTH (7)
7
7
 
8
- typedef struct
9
- {
10
- char *numeral;
11
- unsigned int value;
8
+ typedef struct {
9
+ char *numeral;
10
+ unsigned int value;
12
11
  } numeral_values_t;
13
12
 
14
- const numeral_values_t numeral_values[] =
15
- {
16
- { "M", 1000 },
17
- { "CM", 900 },
18
- { "D", 500 },
19
- { "CD", 400 },
20
- { "C", 100 },
21
- { "XC", 90 },
22
- { "L", 50 },
23
- { "XL", 40 },
24
- { "X", 10 },
25
- { "IX", 9 },
26
- { "V", 5 },
27
- { "IV", 4 },
28
- { "I", 1 }
13
+ const numeral_values_t numeral_values[] = {
14
+ {"M", 1000},
15
+ {"CM", 900},
16
+ {"D", 500},
17
+ {"CD", 400},
18
+ {"C", 100},
19
+ {"XC", 90},
20
+ {"L", 50},
21
+ {"XL", 40},
22
+ {"X", 10},
23
+ {"IX", 9},
24
+ {"V", 5},
25
+ {"IV", 4},
26
+ {"I", 1}
29
27
  };
30
28
 
31
- char * to_roman_numeral(unsigned int number)
29
+ char *to_roman_numeral(unsigned int number)
32
30
  {
33
31
  char *numerals = calloc(0, sizeof(char) * MAX_NUMERAL_LENGTH);
34
32
 
35
33
  for (size_t i = 0; i < NUM_OF_ELEMENTS(numeral_values); i++) {
36
34
  while (number >= numeral_values[i].value) {
37
- strncat(numerals, numeral_values[i].numeral, MAX_NUMERAL_LENGTH - strlen(numerals));
35
+ strncat(numerals, numeral_values[i].numeral,
36
+ MAX_NUMERAL_LENGTH - strlen(numerals));
38
37
  number -= numeral_values[i].value;
39
38
  }
40
39
  }
@@ -1,6 +1,6 @@
1
1
  #ifndef _ROMAN_NUMERALS_H
2
2
  #define _ROMAN_NUMERALS_H
3
3
 
4
- char * to_roman_numeral(unsigned int number);
4
+ char *to_roman_numeral(unsigned int number);
5
5
 
6
6
  #endif
@@ -8,6 +8,7 @@ static void test_conversion(int number, char *expected)
8
8
  TEST_ASSERT_EQUAL_STRING(expected, result);
9
9
  free(result);
10
10
  }
11
+
11
12
  void test_one_yields_I(void)
12
13
  {
13
14
  test_conversion(1, "I");
@@ -1,7 +1,9 @@
1
1
  #include "sum_of_multiples.h"
2
2
  #include <stdbool.h>
3
3
 
4
- unsigned int sum_of_multiples(const unsigned int *multiples, const size_t number_of_multiples, const unsigned int upper_bound)
4
+ unsigned int sum_of_multiples(const unsigned int *multiples,
5
+ const size_t number_of_multiples,
6
+ const unsigned int upper_bound)
5
7
  {
6
8
  unsigned int sum = 0;
7
9
 
@@ -3,6 +3,8 @@
3
3
 
4
4
  #include <stddef.h>
5
5
 
6
- unsigned int sum_of_multiples(const unsigned int *multiples, const size_t number_of_multiples, const unsigned int up_to);
6
+ unsigned int sum_of_multiples(const unsigned int *multiples,
7
+ const size_t number_of_multiples,
8
+ const unsigned int up_to);
7
9
 
8
10
  #endif
@@ -5,68 +5,90 @@
5
5
 
6
6
  void test_sum_of_multiples_of_3_and_5_up_to_1(void)
7
7
  {
8
- const unsigned int multiples[] = {3, 5};
9
- TEST_ASSERT_EQUAL(0, sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples), 1));
8
+ const unsigned int multiples[] = { 3, 5 };
9
+ TEST_ASSERT_EQUAL(0,
10
+ sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples),
11
+ 1));
10
12
  }
11
13
 
12
14
  void test_sum_of_multiples_of_3_and_5_up_to_4(void)
13
15
  {
14
- const unsigned int multiples[] = {3, 5};
15
- TEST_ASSERT_EQUAL(3, sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples), 4));
16
+ const unsigned int multiples[] = { 3, 5 };
17
+ TEST_ASSERT_EQUAL(3,
18
+ sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples),
19
+ 4));
16
20
  }
17
21
 
18
22
  void test_sum_of_multiples_of_3_and_5_up_to_10(void)
19
23
  {
20
- const unsigned int multiples[] = {3, 5};
21
- TEST_ASSERT_EQUAL(23, sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples), 10));
24
+ const unsigned int multiples[] = { 3, 5 };
25
+ TEST_ASSERT_EQUAL(23,
26
+ sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples),
27
+ 10));
22
28
  }
23
29
 
24
30
  void test_sum_of_multiples_of_3_and_5_up_to_100(void)
25
31
  {
26
- const unsigned int multiples[] = {3, 5};
27
- TEST_ASSERT_EQUAL(2318, sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples), 100));
32
+ const unsigned int multiples[] = { 3, 5 };
33
+ TEST_ASSERT_EQUAL(2318,
34
+ sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples),
35
+ 100));
28
36
  }
29
37
 
30
38
  void test_sum_of_multiples_of_3_and_5_up_to_1000(void)
31
39
  {
32
- const unsigned int multiples[] = {3, 5};
33
- TEST_ASSERT_EQUAL(233168, sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples), 1000));
40
+ const unsigned int multiples[] = { 3, 5 };
41
+ TEST_ASSERT_EQUAL(233168,
42
+ sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples),
43
+ 1000));
34
44
  }
35
45
 
36
46
  void test_sum_of_multiples_of_7_13_and_17_up_to_20(void)
37
47
  {
38
- const unsigned int multiples[] = {7, 13, 17};
39
- TEST_ASSERT_EQUAL(51, sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples), 20));
48
+ const unsigned int multiples[] = { 7, 13, 17 };
49
+ TEST_ASSERT_EQUAL(51,
50
+ sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples),
51
+ 20));
40
52
  }
41
53
 
42
54
  void test_sum_of_multiples_of_4_and_6_up_to_15(void)
43
55
  {
44
- const unsigned int multiples[] = {4, 6};
45
- TEST_ASSERT_EQUAL(30, sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples), 15));
56
+ const unsigned int multiples[] = { 4, 6 };
57
+ TEST_ASSERT_EQUAL(30,
58
+ sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples),
59
+ 15));
46
60
  }
47
61
 
48
62
  void test_sum_of_multiples_of_5_6_and_8_up_to_150(void)
49
63
  {
50
- const unsigned int multiples[] = {5, 6, 8};
51
- TEST_ASSERT_EQUAL(4419, sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples), 150));
64
+ const unsigned int multiples[] = { 5, 6, 8 };
65
+ TEST_ASSERT_EQUAL(4419,
66
+ sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples),
67
+ 150));
52
68
  }
53
69
 
54
70
  void test_sum_of_multiples_of_5_and_25_up_to_51(void)
55
71
  {
56
- const unsigned int multiples[] = {5, 25};
57
- TEST_ASSERT_EQUAL(275, sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples), 51));
72
+ const unsigned int multiples[] = { 5, 25 };
73
+ TEST_ASSERT_EQUAL(275,
74
+ sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples),
75
+ 51));
58
76
  }
59
77
 
60
78
  void test_sum_of_multiples_of_43_and_47_up_to_10000(void)
61
79
  {
62
- const unsigned int multiples[] = {43, 47};
63
- TEST_ASSERT_EQUAL(2203160, sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples), 10000));
80
+ const unsigned int multiples[] = { 43, 47 };
81
+ TEST_ASSERT_EQUAL(2203160,
82
+ sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples),
83
+ 10000));
64
84
  }
65
85
 
66
86
  void test_sum_of_multiples_of_1_up_to_100(void)
67
87
  {
68
- const unsigned int multiples[] = {1};
69
- TEST_ASSERT_EQUAL(4950, sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples), 100));
88
+ const unsigned int multiples[] = { 1 };
89
+ TEST_ASSERT_EQUAL(4950,
90
+ sum_of_multiples(multiples, NUM_OF_ELEMENTS(multiples),
91
+ 100));
70
92
  }
71
93
 
72
94
  void test_no_multiples_given(void)
@@ -0,0 +1,16 @@
1
+ CFLAGS = -std=c99
2
+ CFLAGS += -Wall
3
+ CFLAGS += -Wextra
4
+ CFLAGS += -pedantic
5
+ CFLAGS += -Werror
6
+
7
+
8
+ test: tests.out
9
+ @./tests.out
10
+
11
+ clean:
12
+ rm -f *.o *.out
13
+
14
+ tests.out: test/test_word_count.c src/word_count.c src/word_count.h
15
+ @echo Compiling $@
16
+ @cc $(CFLAGS) src/word_count.c test/vendor/unity.c test/test_word_count.c -o tests.out
@@ -0,0 +1,65 @@
1
+ #include <stdlib.h>
2
+ #include <string.h>
3
+ #include <ctype.h>
4
+ #include "word_count.h"
5
+
6
+ // checks to see if we are counting a given word:
7
+ // if word counted already it returns index,
8
+ // else returns -1
9
+ static int word_match(char *testWord, int current_word_count,
10
+ WordCount_Word_t words[MAX_WORDS])
11
+ {
12
+ int matchIndex = -1;
13
+
14
+ for (int index = 0; index < current_word_count; index++) {
15
+ if (!strcmp(testWord, words[index].text)) {
16
+ matchIndex = index;
17
+ break;
18
+ }
19
+ }
20
+ return matchIndex;
21
+ }
22
+
23
+ int word_count(char *input_text, WordCount_Word_t words[MAX_WORDS])
24
+ {
25
+ int index;
26
+ int uniqueWords = 0;
27
+ char *testWord;
28
+ char *lowerCaseInputText; // hold lowercase copy of passed text
29
+ const char *delimiters = " ,.-\n:!!&@$%^&\"";
30
+
31
+ // convert the input text to lower case
32
+ lowerCaseInputText = malloc(strlen(input_text) + 1);
33
+ for (index = 0; input_text[index] != 0; index++) {
34
+ lowerCaseInputText[index] = tolower(input_text[index]);
35
+ }
36
+ lowerCaseInputText[index] = '\0';
37
+
38
+ // start with known results...
39
+ memset(words, 0, sizeof(WordCount_Word_t));
40
+
41
+ testWord = strtok(lowerCaseInputText, delimiters);
42
+ while (testWord != NULL) {
43
+ // account for leading/trailing single quote.
44
+ if (('\'' == testWord[0]) && ('\'' == testWord[strlen(testWord) - 1])) {
45
+ testWord[strlen(testWord) - 1] = '\0';
46
+ testWord++;
47
+ }
48
+ // determine index of counted word.
49
+ index = word_match(testWord, uniqueWords, words);
50
+
51
+ // add if not yet counted else increment count.
52
+ if (-1 == index) {
53
+ words[uniqueWords].count = 1;
54
+ strcpy(words[uniqueWords].text, testWord);
55
+ uniqueWords++;
56
+ } else {
57
+ words[index].count++;
58
+ }
59
+ // get next word in string
60
+ testWord = strtok(NULL, delimiters);
61
+ }
62
+
63
+ free(lowerCaseInputText);
64
+ return uniqueWords;
65
+ }
@@ -0,0 +1,22 @@
1
+ #ifndef _WORD_COUNT_H
2
+ #define _WORD_COUNT_H
3
+
4
+ #define MAX_WORDS 20 // at most MAX_WORDS will be found in the test input string
5
+ #define MAX_WORD_LENGTH 50 // no individual word will exceed this length
6
+
7
+ // results structure
8
+ typedef struct WordCount_Word {
9
+ char text[MAX_WORD_LENGTH];
10
+ int count;
11
+ } WordCount_Word_t;
12
+
13
+ // word_count - routine to classify the unique words and their frequency in a test input string
14
+ // inputs:
15
+ // input_text = string no longer than will take (MAX_WORDS * MAX_WORD_LENGTH)
16
+ // words = allocated structure to record the words fourn and their frequency
17
+ //
18
+ // outputs:
19
+ // uniqueWords - number of words in the words structure
20
+ int word_count(char *input_text, WordCount_Word_t words[MAX_WORDS]);
21
+
22
+ #endif