aboutsummaryrefslogtreecommitdiff
path: root/learn-you-some-erlang/release/erlcount-1.0/src/erlcount_lib.erl
diff options
context:
space:
mode:
Diffstat (limited to 'learn-you-some-erlang/release/erlcount-1.0/src/erlcount_lib.erl')
-rw-r--r--learn-you-some-erlang/release/erlcount-1.0/src/erlcount_lib.erl55
1 files changed, 55 insertions, 0 deletions
diff --git a/learn-you-some-erlang/release/erlcount-1.0/src/erlcount_lib.erl b/learn-you-some-erlang/release/erlcount-1.0/src/erlcount_lib.erl
new file mode 100644
index 0000000..70c062f
--- /dev/null
+++ b/learn-you-some-erlang/release/erlcount-1.0/src/erlcount_lib.erl
@@ -0,0 +1,55 @@
+-module(erlcount_lib).
+-export([find_erl/1, regex_count/2]).
+-include_lib("kernel/include/file.hrl").
+
+%% Finds all files ending in .erl
+find_erl(Directory) ->
+ find_erl(Directory, queue:new()).
+
+regex_count(Re, Str) ->
+ case re:run(Str, Re, [global]) of
+ nomatch -> 0;
+ {match, List} -> length(List)
+ end.
+
+%%% Private
+%% Dispatches based on file type
+find_erl(Name, Queue) ->
+ {ok, F = #file_info{}} = file:read_file_info(Name),
+ case F#file_info.type of
+ directory -> handle_directory(Name, Queue);
+ regular -> handle_regular_file(Name, Queue);
+ _Other -> dequeue_and_run(Queue)
+ end.
+
+%% Opens directories and enqueues files in there
+handle_directory(Dir, Queue) ->
+ case file:list_dir(Dir) of
+ {ok, []} ->
+ dequeue_and_run(Queue);
+ {ok, Files} ->
+ dequeue_and_run(enqueue_many(Dir, Files, Queue))
+ end.
+
+%% Checks if the file finishes in .erl
+handle_regular_file(Name, Queue) ->
+ case filename:extension(Name) of
+ ".erl" ->
+ {continue, Name, fun() -> dequeue_and_run(Queue) end};
+ _NonErl ->
+ dequeue_and_run(Queue)
+ end.
+
+%% Pops an item from the queue and runs it.
+dequeue_and_run(Queue) ->
+ case queue:out(Queue) of
+ {empty, _} -> done;
+ {{value, File}, NewQueue} -> find_erl(File, NewQueue)
+ end.
+
+%% Adds a bunch of items to the queue.
+enqueue_many(Path, Files, Queue) ->
+ F = fun(File, Q) -> queue:in(filename:join(Path,File), Q) end,
+ lists:foldl(F, Queue, Files).
+
+