trackler 2.0.0.5 → 2.0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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