/deps/mochiweb/src/mochiweb_io.erl

http://github.com/zotonic/zotonic · Erlang · 43 lines · 27 code · 10 blank · 6 comment · 0 complexity · aba45bd4d614a7e2e23908344168081a MD5 · raw file

  1. %% @author Bob Ippolito <bob@mochimedia.com>
  2. %% @copyright 2007 Mochi Media, Inc.
  3. %% @doc Utilities for dealing with IO devices (open files).
  4. -module(mochiweb_io).
  5. -author('bob@mochimedia.com').
  6. -export([iodevice_stream/3, iodevice_stream/2]).
  7. -export([iodevice_foldl/4, iodevice_foldl/3]).
  8. -export([iodevice_size/1]).
  9. -define(READ_SIZE, 8192).
  10. iodevice_foldl(F, Acc, IoDevice) ->
  11. iodevice_foldl(F, Acc, IoDevice, ?READ_SIZE).
  12. iodevice_foldl(F, Acc, IoDevice, BufferSize) ->
  13. case file:read(IoDevice, BufferSize) of
  14. eof ->
  15. Acc;
  16. {ok, Data} ->
  17. iodevice_foldl(F, F(Data, Acc), IoDevice, BufferSize)
  18. end.
  19. iodevice_stream(Callback, IoDevice) ->
  20. iodevice_stream(Callback, IoDevice, ?READ_SIZE).
  21. iodevice_stream(Callback, IoDevice, BufferSize) ->
  22. F = fun (Data, ok) -> Callback(Data) end,
  23. ok = iodevice_foldl(F, ok, IoDevice, BufferSize).
  24. iodevice_size(IoDevice) ->
  25. {ok, Size} = file:position(IoDevice, eof),
  26. {ok, 0} = file:position(IoDevice, bof),
  27. Size.
  28. %%
  29. %% Tests
  30. %%
  31. -ifdef(TEST).
  32. -include_lib("eunit/include/eunit.hrl").
  33. -endif.