falsework 0.2.8 → 1.3.0
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.
- data/{lib/falsework/templates/naive/Gemfile.erb → Gemfile} +1 -1
 - data/Gemfile.lock +12 -0
 - data/README.rdoc +45 -21
 - data/Rakefile +5 -5
 - data/bin/falsework +64 -28
 - data/doc/NEWS.rdoc +37 -10
 - data/doc/README.rdoc +45 -21
 - data/doc/TODO.org +13 -0
 - data/doc/template-tutorial.rdoc +113 -0
 - data/etc/falsework.yaml +1 -1
 - data/lib/falsework/meta.rb +3 -2
 - data/lib/falsework/mould.rb +267 -146
 - data/lib/falsework/templates/c-glib/#config.yaml +18 -0
 - data/lib/falsework/templates/c-glib/README +24 -0
 - data/lib/falsework/templates/c-glib/doc/#doc.ascii +46 -0
 - data/lib/falsework/templates/c-glib/doc/%%@project%%.1.asciidoc +46 -0
 - data/lib/falsework/templates/{naive/doc/LICENSE.erb → c-glib/doc/LICENSE} +1 -1
 - data/lib/falsework/templates/c-glib/doc/Makefile +17 -0
 - data/lib/falsework/templates/c-glib/src/#exe.c +23 -0
 - data/lib/falsework/templates/c-glib/src/#exe.h +8 -0
 - data/lib/falsework/templates/c-glib/src/%%@project%%.c +23 -0
 - data/lib/falsework/templates/c-glib/src/%%@project%%.h +26 -0
 - data/lib/falsework/templates/c-glib/src/Makefile +28 -0
 - data/lib/falsework/templates/c-glib/src/untest.c +9 -0
 - data/lib/falsework/templates/c-glib/src/untest.h +14 -0
 - data/lib/falsework/templates/c-glib/src/utils.c +232 -0
 - data/lib/falsework/templates/c-glib/src/utils.h +45 -0
 - data/lib/falsework/templates/c-glib/test/#test.c +48 -0
 - data/lib/falsework/templates/c-glib/test/Makefile +78 -0
 - data/lib/falsework/templates/c-glib/test/Makefile.test.mk +72 -0
 - data/lib/falsework/templates/c-glib/test/mycat.c +8 -0
 - data/{test/templates/.keep_me → lib/falsework/templates/c-glib/test/semis/text/empty.txt} +0 -0
 - data/lib/falsework/templates/c-glib/test/test_utils.c +134 -0
 - data/lib/falsework/templates/ruby-naive/#config.yaml +15 -0
 - data/lib/falsework/templates/{naive/.gitignore.erb → ruby-naive/.gitignore.#erb} +0 -0
 - data/lib/falsework/templates/ruby-naive/Gemfile +4 -0
 - data/lib/falsework/templates/{naive/doc/README.rdoc.erb → ruby-naive/README.rdoc} +2 -2
 - data/lib/falsework/templates/{naive/Rakefile.erb → ruby-naive/Rakefile} +1 -1
 - data/lib/falsework/templates/{naive/bin/%%@project%%.erb → ruby-naive/bin/%%@project%%} +5 -5
 - data/lib/falsework/templates/{naive/doc/#util.rdoc.erb → ruby-naive/doc/#doc.rdoc} +6 -6
 - data/lib/falsework/templates/ruby-naive/doc/LICENSE +22 -0
 - data/lib/falsework/templates/{naive/doc/NEWS.rdoc.erb → ruby-naive/doc/NEWS.rdoc} +0 -0
 - data/lib/falsework/templates/{naive/README.rdoc.erb → ruby-naive/doc/README.rdoc} +2 -2
 - data/lib/falsework/templates/{naive/etc/%%@project%%.yaml.erb → ruby-naive/etc/%%@project%%.yaml} +0 -0
 - data/lib/falsework/templates/{naive/lib/%%@project%%/meta.rb.erb → ruby-naive/lib/%%@project%%/meta.rb} +3 -2
 - data/lib/falsework/templates/{naive/lib/%%@project%%/trestle.rb.erb → ruby-naive/lib/%%@project%%/trestle.rb} +22 -14
 - data/lib/falsework/templates/{naive/test/helper.rb.erb → ruby-naive/test/helper.rb} +0 -0
 - data/lib/falsework/templates/{naive/test/helper_trestle.rb.erb → ruby-naive/test/helper_trestle.rb} +2 -2
 - data/lib/falsework/templates/{naive/test/rake_git.rb.erb → ruby-naive/test/rake_git.rb} +1 -1
 - data/lib/falsework/templates/{naive/test/test_%%@project%%.rb.erb → ruby-naive/test/test_%%@project%%.rb} +1 -1
 - data/lib/falsework/trestle.rb +17 -9
 - data/test/rake_erb_templates.rb +4 -4
 - data/test/templates/config-01.yaml +2 -0
 - data/test/test_cl.rb +29 -0
 - data/test/test_exe.rb +61 -30
 - data/test/test_mould.rb +80 -0
 - metadata +86 -60
 - data/doc/TODO.rdoc +0 -7
 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            :exe:
         
     | 
| 
      
 3 
     | 
    
         
            +
            - :src: 'src/#exe.h'
         
     | 
| 
      
 4 
     | 
    
         
            +
              :dest: 'src/%s.h'
         
     | 
| 
      
 5 
     | 
    
         
            +
              :mode_int: null
         
     | 
| 
      
 6 
     | 
    
         
            +
            - :src: 'src/#exe.c'
         
     | 
| 
      
 7 
     | 
    
         
            +
              :dest: 'src/%s.c'
         
     | 
| 
      
 8 
     | 
    
         
            +
              :mode_int: null
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            :doc:
         
     | 
| 
      
 11 
     | 
    
         
            +
            - :src: 'doc/#doc.ascii'
         
     | 
| 
      
 12 
     | 
    
         
            +
              :dest: 'doc/%s.1.asciidoc'
         
     | 
| 
      
 13 
     | 
    
         
            +
              :mode_int: null
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            :test:
         
     | 
| 
      
 16 
     | 
    
         
            +
            - :src: 'test/#test.c'
         
     | 
| 
      
 17 
     | 
    
         
            +
              :dest: 'test/test_%s.c'
         
     | 
| 
      
 18 
     | 
    
         
            +
              :mode_int: null
         
     | 
| 
         @@ -0,0 +1,24 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            -*-text-*-
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            <%= @classy %> is a [TODO: write a description]
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            Requirements
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            Runtime:
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            * FreeBSD/Linux
         
     | 
| 
      
 11 
     | 
    
         
            +
            * glib 2.x
         
     | 
| 
      
 12 
     | 
    
         
            +
            * libiconv
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            Build:
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            * gcc 4.x
         
     | 
| 
      
 17 
     | 
    
         
            +
            * GNU make
         
     | 
| 
      
 18 
     | 
    
         
            +
            * asciidoc
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            Examples
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            % <%= @project %> -h
         
     | 
| 
      
 24 
     | 
    
         
            +
            % <%= @project %> 
         
     | 
| 
         @@ -0,0 +1,46 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            // -*-doc-*-
         
     | 
| 
      
 2 
     | 
    
         
            +
            <%= target.upcase %>(1)
         
     | 
| 
      
 3 
     | 
    
         
            +
            <% target.size.times {|i| %>=<% } %>===
         
     | 
| 
      
 4 
     | 
    
         
            +
            :doctype: manpage
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            NAME
         
     | 
| 
      
 7 
     | 
    
         
            +
            ----
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            <%= target %> - [TODO: write a description]
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            SYNOPSIS
         
     | 
| 
      
 12 
     | 
    
         
            +
            --------
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            *<%= target %>* [-q]
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            DESCRIPTION
         
     | 
| 
      
 17 
     | 
    
         
            +
            -----------
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            <%= target %> is a [TODO: write a description]
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            OPTIONS
         
     | 
| 
      
 22 
     | 
    
         
            +
            -------
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            *-q*::
         
     | 
| 
      
 25 
     | 
    
         
            +
            		Don't show warnings.
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            EXIT STATUS
         
     | 
| 
      
 29 
     | 
    
         
            +
            -----------
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            Program exits 0 on success or >= 1 if en error occurs.
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            BUGS
         
     | 
| 
      
 34 
     | 
    
         
            +
            ----
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            Probably.
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            SEE ALSO
         
     | 
| 
      
 39 
     | 
    
         
            +
            --------
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            man(1), hier(7)
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            AUTHORS
         
     | 
| 
      
 44 
     | 
    
         
            +
            -------
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            <%= @gecos %> <<%= @email %>>.
         
     | 
| 
         @@ -0,0 +1,46 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            // -*-doc-*-
         
     | 
| 
      
 2 
     | 
    
         
            +
            <%= @project.upcase %>(1)
         
     | 
| 
      
 3 
     | 
    
         
            +
            <% @project.size.times {|i| %>=<% } %>===
         
     | 
| 
      
 4 
     | 
    
         
            +
            :doctype: manpage
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            NAME
         
     | 
| 
      
 7 
     | 
    
         
            +
            ----
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            <%= @project %> - [TODO: write a description]
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            SYNOPSIS
         
     | 
| 
      
 12 
     | 
    
         
            +
            --------
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            *<%= @project %>* [-q]
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            DESCRIPTION
         
     | 
| 
      
 17 
     | 
    
         
            +
            -----------
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            <%= @project %> is a [TODO: write a description]
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            OPTIONS
         
     | 
| 
      
 22 
     | 
    
         
            +
            -------
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            *-q*::
         
     | 
| 
      
 25 
     | 
    
         
            +
            		Don't show warnings.
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            EXIT STATUS
         
     | 
| 
      
 29 
     | 
    
         
            +
            -----------
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            Program exits 0 on success or >= 1 if en error occurs.
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            BUGS
         
     | 
| 
      
 34 
     | 
    
         
            +
            ----
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            Probably.
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            SEE ALSO
         
     | 
| 
      
 39 
     | 
    
         
            +
            --------
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            man(1), hier(7)
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            AUTHORS
         
     | 
| 
      
 44 
     | 
    
         
            +
            -------
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            <%= @gecos %> <<%= @email %>>.
         
     | 
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            .PHONY : clean
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            MAN_ASCIIDOC := $(wildcard *.1.asciidoc)
         
     | 
| 
      
 4 
     | 
    
         
            +
            MAN := $(patsubst %.1.asciidoc,%.1,$(wildcard *.1.asciidoc))
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            all: $(MAN)
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            %.1: %.1.asciidoc
         
     | 
| 
      
 9 
     | 
    
         
            +
            	a2x -f manpage $<
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            clean:
         
     | 
| 
      
 12 
     | 
    
         
            +
            	rm -f $(MAN)
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            # Debug. Use 'gmake p-obj' to print $(obj) variable.
         
     | 
| 
      
 15 
     | 
    
         
            +
            p-%:
         
     | 
| 
      
 16 
     | 
    
         
            +
            	@echo $* = $($*)
         
     | 
| 
      
 17 
     | 
    
         
            +
            	@echo $*\'s origin is $(origin $*)
         
     | 
| 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include "<%= target %>.h"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            int main(int argc, char **argv)
         
     | 
| 
      
 4 
     | 
    
         
            +
            {
         
     | 
| 
      
 5 
     | 
    
         
            +
            	g_set_prgname(basename(argv[0]));
         
     | 
| 
      
 6 
     | 
    
         
            +
            	
         
     | 
| 
      
 7 
     | 
    
         
            +
            	int exit_code = 0, ch;
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            	while ((ch = getopt(argc, argv, "qh")) != -1) {
         
     | 
| 
      
 10 
     | 
    
         
            +
            		switch (ch) {
         
     | 
| 
      
 11 
     | 
    
         
            +
            		case 'q':
         
     | 
| 
      
 12 
     | 
    
         
            +
            			mylog_to(MYLOG_BITBUCKET);
         
     | 
| 
      
 13 
     | 
    
         
            +
            			break;
         
     | 
| 
      
 14 
     | 
    
         
            +
            		default:
         
     | 
| 
      
 15 
     | 
    
         
            +
            			printf("Usage: %s [-q]\n", argv[0]);
         
     | 
| 
      
 16 
     | 
    
         
            +
            			exit(1);
         
     | 
| 
      
 17 
     | 
    
         
            +
            		}
         
     | 
| 
      
 18 
     | 
    
         
            +
            	}
         
     | 
| 
      
 19 
     | 
    
         
            +
            	argc -= optind;
         
     | 
| 
      
 20 
     | 
    
         
            +
            	argv += optind;
         
     | 
| 
      
 21 
     | 
    
         
            +
            	
         
     | 
| 
      
 22 
     | 
    
         
            +
            	return exit_code;
         
     | 
| 
      
 23 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include "<%= @project %>.h"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            int main(int argc, char **argv)
         
     | 
| 
      
 4 
     | 
    
         
            +
            {
         
     | 
| 
      
 5 
     | 
    
         
            +
            	g_set_prgname(basename(argv[0]));
         
     | 
| 
      
 6 
     | 
    
         
            +
            	
         
     | 
| 
      
 7 
     | 
    
         
            +
            	int exit_code = 0, ch;
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            	while ((ch = getopt(argc, argv, "qh")) != -1) {
         
     | 
| 
      
 10 
     | 
    
         
            +
            		switch (ch) {
         
     | 
| 
      
 11 
     | 
    
         
            +
            		case 'q':
         
     | 
| 
      
 12 
     | 
    
         
            +
            			mylog_to(MYLOG_BITBUCKET);
         
     | 
| 
      
 13 
     | 
    
         
            +
            			break;
         
     | 
| 
      
 14 
     | 
    
         
            +
            		default:
         
     | 
| 
      
 15 
     | 
    
         
            +
            			printf("Usage: %s [-q]\n", argv[0]);
         
     | 
| 
      
 16 
     | 
    
         
            +
            			exit(1);
         
     | 
| 
      
 17 
     | 
    
         
            +
            		}
         
     | 
| 
      
 18 
     | 
    
         
            +
            	}
         
     | 
| 
      
 19 
     | 
    
         
            +
            	argc -= optind;
         
     | 
| 
      
 20 
     | 
    
         
            +
            	argv += optind;
         
     | 
| 
      
 21 
     | 
    
         
            +
            	
         
     | 
| 
      
 22 
     | 
    
         
            +
            	return exit_code;
         
     | 
| 
      
 23 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #ifndef <%= uuid + '_' + @project.upcase %>_H
         
     | 
| 
      
 2 
     | 
    
         
            +
            #define <%= uuid + '_' + @project.upcase %>_H
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            #define PROG_NAME "<%= @project %>"
         
     | 
| 
      
 5 
     | 
    
         
            +
            #define PROG_VER "0.0.1"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            #include <errno.h>
         
     | 
| 
      
 8 
     | 
    
         
            +
            #include <fcntl.h>
         
     | 
| 
      
 9 
     | 
    
         
            +
            #include <libgen.h>
         
     | 
| 
      
 10 
     | 
    
         
            +
            #include <pthread.h>
         
     | 
| 
      
 11 
     | 
    
         
            +
            #include <signal.h>
         
     | 
| 
      
 12 
     | 
    
         
            +
            #include <stdio.h>
         
     | 
| 
      
 13 
     | 
    
         
            +
            #include <stdlib.h>
         
     | 
| 
      
 14 
     | 
    
         
            +
            #include <string.h>
         
     | 
| 
      
 15 
     | 
    
         
            +
            #include <sys/types.h>
         
     | 
| 
      
 16 
     | 
    
         
            +
            #include <sys/stat.h>
         
     | 
| 
      
 17 
     | 
    
         
            +
            #include <sys/uio.h>
         
     | 
| 
      
 18 
     | 
    
         
            +
            #include <sys/wait.h>
         
     | 
| 
      
 19 
     | 
    
         
            +
            #include <sys/param.h>
         
     | 
| 
      
 20 
     | 
    
         
            +
            #include <unistd.h>
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            #include <glib.h>
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            #include "utils.h" // some goodies
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            #endif // <%= uuid + '_' + @project.upcase %>_H
         
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            gnome := glib-2.0
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            CFLAGS := -Wall -Wno-pointer-sign \
         
     | 
| 
      
 4 
     | 
    
         
            +
            	-I/usr/local/include \
         
     | 
| 
      
 5 
     | 
    
         
            +
                    $(shell pkg-config --cflags $(gnome) )
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            LDFLAGS := $(shell pkg-config --libs $(gnome) )
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            exe := <%= @project %>
         
     | 
| 
      
 10 
     | 
    
         
            +
            obj := $(patsubst %.c,%.o,$(wildcard *.c))
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            .SECONDEXPANSION:
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            all: $(obj) $(exe)
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            $(obj): <%= @project %>.h
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            <%= @project %>.o: <%= @project %>.h
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            <%= @project %>: utils.o $$@.o
         
     | 
| 
      
 21 
     | 
    
         
            +
            	$(CC) $^ -o $@ $(CFLAGS) $(LDFLAGS)
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            clean:
         
     | 
| 
      
 24 
     | 
    
         
            +
            	rm -rf $(exe) $(obj) *.core
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            print-%:
         
     | 
| 
      
 27 
     | 
    
         
            +
            	@echo $* = $($*)
         
     | 
| 
      
 28 
     | 
    
         
            +
            	@echo $*\'s origin is $(origin $*)
         
     | 
| 
         @@ -0,0 +1,14 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #ifndef UNTEST_H
         
     | 
| 
      
 2 
     | 
    
         
            +
            #define UNTEST_H
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            /*
         
     | 
| 
      
 5 
     | 
    
         
            +
              Routines useful only for unit tests and glib's test framework.
         
     | 
| 
      
 6 
     | 
    
         
            +
             */
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            #include "<%= @project %>.h"
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            gboolean
         
     | 
| 
      
 11 
     | 
    
         
            +
            mylog_fatal_handler(const gchar *log_domain, GLogLevelFlags log_level,
         
     | 
| 
      
 12 
     | 
    
         
            +
            					const gchar *message, gpointer user_data);
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            #endif // UNTEST_H
         
     | 
| 
         @@ -0,0 +1,232 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include <iconv.h>
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            #include "utils.h"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            /* The result should be freed with g_free(). */
         
     | 
| 
      
 6 
     | 
    
         
            +
            gchar *
         
     | 
| 
      
 7 
     | 
    
         
            +
            text2utf8(const gchar *buf, const gchar *from) {
         
     | 
| 
      
 8 
     | 
    
         
            +
            	gsize br, bw;
         
     | 
| 
      
 9 
     | 
    
         
            +
            	if (!buf) return NULL;
         
     | 
| 
      
 10 
     | 
    
         
            +
            	if (!from) return (gchar*)buf;
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            	if (g_regex_match_simple("utf.?8", from, G_REGEX_CASELESS, 0))
         
     | 
| 
      
 13 
     | 
    
         
            +
            		return g_strdup(buf); // prevent converting from utf8 to utf8
         
     | 
| 
      
 14 
     | 
    
         
            +
            	else 
         
     | 
| 
      
 15 
     | 
    
         
            +
            		return g_convert_with_fallback(buf, -1, "UTF-8", from,
         
     | 
| 
      
 16 
     | 
    
         
            +
            									   NULL, &br, &bw, NULL);
         
     | 
| 
      
 17 
     | 
    
         
            +
            }
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            /*
         
     | 
| 
      
 20 
     | 
    
         
            +
              Take a variable number of arguments and return the pointer to the
         
     | 
| 
      
 21 
     | 
    
         
            +
              first non-NULL one. The argument list must end with &sentinel.
         
     | 
| 
      
 22 
     | 
    
         
            +
             */
         
     | 
| 
      
 23 
     | 
    
         
            +
            char
         
     | 
| 
      
 24 
     | 
    
         
            +
            *first(char *first, ...)
         
     | 
| 
      
 25 
     | 
    
         
            +
            {
         
     | 
| 
      
 26 
     | 
    
         
            +
            	va_list ap;
         
     | 
| 
      
 27 
     | 
    
         
            +
                char *r = first;
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                va_start(ap, first);
         
     | 
| 
      
 30 
     | 
    
         
            +
                while (!r) {
         
     | 
| 
      
 31 
     | 
    
         
            +
                    r = va_arg(ap, char*);
         
     | 
| 
      
 32 
     | 
    
         
            +
                }
         
     | 
| 
      
 33 
     | 
    
         
            +
            	va_end(ap);
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                return r == &sentinel ? NULL : r;
         
     | 
| 
      
 36 
     | 
    
         
            +
            }
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            /*
         
     | 
| 
      
 39 
     | 
    
         
            +
              Read @fd till EOF and return the a null-terminated result with the
         
     | 
| 
      
 40 
     | 
    
         
            +
              size of the string in @len (pass NULL if you're not interested).
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              The result should be freed with g_free().
         
     | 
| 
      
 43 
     | 
    
         
            +
             */
         
     | 
| 
      
 44 
     | 
    
         
            +
            gchar*
         
     | 
| 
      
 45 
     | 
    
         
            +
            chan_read(int fd, gsize *len)
         
     | 
| 
      
 46 
     | 
    
         
            +
            {
         
     | 
| 
      
 47 
     | 
    
         
            +
            	gsize n;
         
     | 
| 
      
 48 
     | 
    
         
            +
            	gchar buf[BUFSIZ];
         
     | 
| 
      
 49 
     | 
    
         
            +
            	gsize size = 0;
         
     | 
| 
      
 50 
     | 
    
         
            +
            	gchar *r = g_malloc((BUFSIZ+1) * sizeof *buf);
         
     | 
| 
      
 51 
     | 
    
         
            +
            	
         
     | 
| 
      
 52 
     | 
    
         
            +
            	while ( (n = readn(fd, buf, BUFSIZ)) > 0) {
         
     | 
| 
      
 53 
     | 
    
         
            +
            		memmove(r+size, buf, n);
         
     | 
| 
      
 54 
     | 
    
         
            +
            		size += n;
         
     | 
| 
      
 55 
     | 
    
         
            +
            		
         
     | 
| 
      
 56 
     | 
    
         
            +
            		gchar *tmp = g_realloc(r, (size+BUFSIZ+1) * sizeof *tmp);
         
     | 
| 
      
 57 
     | 
    
         
            +
            		if (!tmp) {
         
     | 
| 
      
 58 
     | 
    
         
            +
            			g_free(r);
         
     | 
| 
      
 59 
     | 
    
         
            +
            			g_warning("realloc failed");
         
     | 
| 
      
 60 
     | 
    
         
            +
            			size -= n;
         
     | 
| 
      
 61 
     | 
    
         
            +
            			break;
         
     | 
| 
      
 62 
     | 
    
         
            +
            		}
         
     | 
| 
      
 63 
     | 
    
         
            +
            		r = tmp;
         
     | 
| 
      
 64 
     | 
    
         
            +
            	}
         
     | 
| 
      
 65 
     | 
    
         
            +
            	r[size] = '\0';
         
     | 
| 
      
 66 
     | 
    
         
            +
            	if (len) *len = size;
         
     | 
| 
      
 67 
     | 
    
         
            +
            	return r;
         
     | 
| 
      
 68 
     | 
    
         
            +
            }
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
            gboolean
         
     | 
| 
      
 71 
     | 
    
         
            +
            pr_exit_warn(const char *cmd, int status)
         
     | 
| 
      
 72 
     | 
    
         
            +
            {
         
     | 
| 
      
 73 
     | 
    
         
            +
            	gboolean ok = TRUE;
         
     | 
| 
      
 74 
     | 
    
         
            +
            	
         
     | 
| 
      
 75 
     | 
    
         
            +
                if (WIFEXITED(status)) {
         
     | 
| 
      
 76 
     | 
    
         
            +
            		if (WEXITSTATUS(status) != 0) {
         
     | 
| 
      
 77 
     | 
    
         
            +
            			g_warning("%s: unexpected termination, exit status %d",
         
     | 
| 
      
 78 
     | 
    
         
            +
            					  cmd, WEXITSTATUS(status));
         
     | 
| 
      
 79 
     | 
    
         
            +
            			ok = FALSE;
         
     | 
| 
      
 80 
     | 
    
         
            +
            		}
         
     | 
| 
      
 81 
     | 
    
         
            +
            	} else if (WIFSIGNALED(status)) {
         
     | 
| 
      
 82 
     | 
    
         
            +
                    g_warning("%s: abnormal termination, signal number %d",
         
     | 
| 
      
 83 
     | 
    
         
            +
            				  cmd, WTERMSIG(status));
         
     | 
| 
      
 84 
     | 
    
         
            +
            		ok = FALSE;
         
     | 
| 
      
 85 
     | 
    
         
            +
            	} else if (WIFSTOPPED(status)) {
         
     | 
| 
      
 86 
     | 
    
         
            +
                    printf("%s: child stopped, signal number %d",
         
     | 
| 
      
 87 
     | 
    
         
            +
            			   cmd, WSTOPSIG(status));
         
     | 
| 
      
 88 
     | 
    
         
            +
            		ok = FALSE;
         
     | 
| 
      
 89 
     | 
    
         
            +
            	}
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
            	return ok;
         
     | 
| 
      
 92 
     | 
    
         
            +
            }
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
            ssize_t						/* Read "n" bytes from a descriptor. */
         
     | 
| 
      
 95 
     | 
    
         
            +
            readn(int fd, void *vptr, size_t n)
         
     | 
| 
      
 96 
     | 
    
         
            +
            {
         
     | 
| 
      
 97 
     | 
    
         
            +
            	size_t	nleft;
         
     | 
| 
      
 98 
     | 
    
         
            +
            	ssize_t	nread;
         
     | 
| 
      
 99 
     | 
    
         
            +
            	char	*ptr;
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
            	ptr = vptr;
         
     | 
| 
      
 102 
     | 
    
         
            +
            	nleft = n;
         
     | 
| 
      
 103 
     | 
    
         
            +
            	while (nleft > 0) {
         
     | 
| 
      
 104 
     | 
    
         
            +
            		if ( (nread = read(fd, ptr, nleft)) < 0) {
         
     | 
| 
      
 105 
     | 
    
         
            +
            			if (errno == EINTR)
         
     | 
| 
      
 106 
     | 
    
         
            +
            				nread = 0;		/* and call read() again */
         
     | 
| 
      
 107 
     | 
    
         
            +
            			else
         
     | 
| 
      
 108 
     | 
    
         
            +
            				return(-1);
         
     | 
| 
      
 109 
     | 
    
         
            +
            		} else if (nread == 0)
         
     | 
| 
      
 110 
     | 
    
         
            +
            			break;				/* EOF */
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
            		nleft -= nread;
         
     | 
| 
      
 113 
     | 
    
         
            +
            		ptr   += nread;
         
     | 
| 
      
 114 
     | 
    
         
            +
            	}
         
     | 
| 
      
 115 
     | 
    
         
            +
            	return(n - nleft);		/* return >= 0 */
         
     | 
| 
      
 116 
     | 
    
         
            +
            }
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
            ssize_t						/* Write "n" bytes to a descriptor. */
         
     | 
| 
      
 119 
     | 
    
         
            +
            writen(int fd, const void *vptr, size_t n)
         
     | 
| 
      
 120 
     | 
    
         
            +
            {
         
     | 
| 
      
 121 
     | 
    
         
            +
            	size_t		nleft;
         
     | 
| 
      
 122 
     | 
    
         
            +
            	ssize_t		nwritten;
         
     | 
| 
      
 123 
     | 
    
         
            +
            	const char	*ptr;
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
            	ptr = vptr;
         
     | 
| 
      
 126 
     | 
    
         
            +
            	nleft = n;
         
     | 
| 
      
 127 
     | 
    
         
            +
            	while (nleft > 0) {
         
     | 
| 
      
 128 
     | 
    
         
            +
            		if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
         
     | 
| 
      
 129 
     | 
    
         
            +
            			if (nwritten < 0 && errno == EINTR)
         
     | 
| 
      
 130 
     | 
    
         
            +
            				nwritten = 0;		/* and call write() again */
         
     | 
| 
      
 131 
     | 
    
         
            +
            			else
         
     | 
| 
      
 132 
     | 
    
         
            +
            				return(-1);			/* error */
         
     | 
| 
      
 133 
     | 
    
         
            +
            		}
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
            		nleft -= nwritten;
         
     | 
| 
      
 136 
     | 
    
         
            +
            		ptr   += nwritten;
         
     | 
| 
      
 137 
     | 
    
         
            +
            	}
         
     | 
| 
      
 138 
     | 
    
         
            +
            	return(n);
         
     | 
| 
      
 139 
     | 
    
         
            +
            }
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
            /*
         
     | 
| 
      
 142 
     | 
    
         
            +
              Removes all leading & trailing whitespace + replaces \n, \t, \r to 1
         
     | 
| 
      
 143 
     | 
    
         
            +
              space. Modifies @s in place.
         
     | 
| 
      
 144 
     | 
    
         
            +
             */
         
     | 
| 
      
 145 
     | 
    
         
            +
            GString*
         
     | 
| 
      
 146 
     | 
    
         
            +
            my_strstrip(GString *s)
         
     | 
| 
      
 147 
     | 
    
         
            +
            {
         
     | 
| 
      
 148 
     | 
    
         
            +
            	if (!s) return NULL;
         
     | 
| 
      
 149 
     | 
    
         
            +
            	GRegex *re = g_regex_new("[\n\r\t]+", 0, 0, NULL);
         
     | 
| 
      
 150 
     | 
    
         
            +
            	char *tmp = g_regex_replace_literal(re, s->str, s->len, 0, " ", 0, NULL);
         
     | 
| 
      
 151 
     | 
    
         
            +
            	g_regex_unref(re);
         
     | 
| 
      
 152 
     | 
    
         
            +
            	
         
     | 
| 
      
 153 
     | 
    
         
            +
            	if (!tmp) return s;
         
     | 
| 
      
 154 
     | 
    
         
            +
            	g_strstrip(tmp);
         
     | 
| 
      
 155 
     | 
    
         
            +
            	g_string_assign(s, tmp);
         
     | 
| 
      
 156 
     | 
    
         
            +
            	g_free(tmp);
         
     | 
| 
      
 157 
     | 
    
         
            +
            	return s;
         
     | 
| 
      
 158 
     | 
    
         
            +
            }
         
     | 
| 
      
 159 
     | 
    
         
            +
             
     | 
| 
      
 160 
     | 
    
         
            +
            /* A callback handler for mylog_to(). */
         
     | 
| 
      
 161 
     | 
    
         
            +
            void
         
     | 
| 
      
 162 
     | 
    
         
            +
            mylog_to_devnull(const gchar *log_domain, GLogLevelFlags log_levels,
         
     | 
| 
      
 163 
     | 
    
         
            +
            				 const gchar *message, gpointer user_data)
         
     | 
| 
      
 164 
     | 
    
         
            +
            {
         
     | 
| 
      
 165 
     | 
    
         
            +
            	/* do nothing, eat all messages */
         
     | 
| 
      
 166 
     | 
    
         
            +
            }
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
      
 168 
     | 
    
         
            +
            /*
         
     | 
| 
      
 169 
     | 
    
         
            +
              Same as g_warning() + exit(1).
         
     | 
| 
      
 170 
     | 
    
         
            +
             */
         
     | 
| 
      
 171 
     | 
    
         
            +
            void myerr(const gchar *format, ...)
         
     | 
| 
      
 172 
     | 
    
         
            +
            {
         
     | 
| 
      
 173 
     | 
    
         
            +
            	if (!format) {
         
     | 
| 
      
 174 
     | 
    
         
            +
            		g_warning("unspecified error");
         
     | 
| 
      
 175 
     | 
    
         
            +
            		exit(1);
         
     | 
| 
      
 176 
     | 
    
         
            +
            	}
         
     | 
| 
      
 177 
     | 
    
         
            +
             
     | 
| 
      
 178 
     | 
    
         
            +
            	va_list args;
         
     | 
| 
      
 179 
     | 
    
         
            +
            	va_start(args, format);
         
     | 
| 
      
 180 
     | 
    
         
            +
            	g_logv(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, format, args);
         
     | 
| 
      
 181 
     | 
    
         
            +
            	va_end (args);
         
     | 
| 
      
 182 
     | 
    
         
            +
             
     | 
| 
      
 183 
     | 
    
         
            +
            	exit(1);
         
     | 
| 
      
 184 
     | 
    
         
            +
            }
         
     | 
| 
      
 185 
     | 
    
         
            +
             
     | 
| 
      
 186 
     | 
    
         
            +
            /*
         
     | 
| 
      
 187 
     | 
    
         
            +
              Switch destination of logs according to @d.
         
     | 
| 
      
 188 
     | 
    
         
            +
             */
         
     | 
| 
      
 189 
     | 
    
         
            +
            void
         
     | 
| 
      
 190 
     | 
    
         
            +
            mylog_to(MyLogDest d)
         
     | 
| 
      
 191 
     | 
    
         
            +
            {
         
     | 
| 
      
 192 
     | 
    
         
            +
            	switch (d) {
         
     | 
| 
      
 193 
     | 
    
         
            +
            	case MYLOG_BITBUCKET:
         
     | 
| 
      
 194 
     | 
    
         
            +
            		g_log_set_handler(NULL, G_LOG_LEVEL_WARNING|G_LOG_LEVEL_CRITICAL,
         
     | 
| 
      
 195 
     | 
    
         
            +
            						  mylog_to_devnull, NULL);
         
     | 
| 
      
 196 
     | 
    
         
            +
            		break;
         
     | 
| 
      
 197 
     | 
    
         
            +
            	case MYLOG_FILES:
         
     | 
| 
      
 198 
     | 
    
         
            +
            		g_error("MYLOG_FILES is unimplemented");
         
     | 
| 
      
 199 
     | 
    
         
            +
            		break;
         
     | 
| 
      
 200 
     | 
    
         
            +
            	default:
         
     | 
| 
      
 201 
     | 
    
         
            +
            		// reset ot glib's default
         
     | 
| 
      
 202 
     | 
    
         
            +
            		g_log_set_handler(NULL, G_LOG_LEVEL_WARNING|G_LOG_LEVEL_CRITICAL,
         
     | 
| 
      
 203 
     | 
    
         
            +
            						  g_log_default_handler, NULL);
         
     | 
| 
      
 204 
     | 
    
         
            +
            		break;
         
     | 
| 
      
 205 
     | 
    
         
            +
            	}
         
     | 
| 
      
 206 
     | 
    
         
            +
            }
         
     | 
| 
      
 207 
     | 
    
         
            +
             
     | 
| 
      
 208 
     | 
    
         
            +
            /*
         
     | 
| 
      
 209 
     | 
    
         
            +
              Do case insensitive regexp replace in @s in place.
         
     | 
| 
      
 210 
     | 
    
         
            +
             
     | 
| 
      
 211 
     | 
    
         
            +
              Return FALSE on error. Warning: TRUE doens't mean that something was
         
     | 
| 
      
 212 
     | 
    
         
            +
              actually replaced.
         
     | 
| 
      
 213 
     | 
    
         
            +
             */
         
     | 
| 
      
 214 
     | 
    
         
            +
            gboolean
         
     | 
| 
      
 215 
     | 
    
         
            +
            my_regsub(GString* s, const gchar *re, const gchar *sub)
         
     | 
| 
      
 216 
     | 
    
         
            +
            {
         
     | 
| 
      
 217 
     | 
    
         
            +
            	if (!s || !re || !sub) return FALSE;
         
     | 
| 
      
 218 
     | 
    
         
            +
            	gboolean r = FALSE;
         
     | 
| 
      
 219 
     | 
    
         
            +
            	GError *e = NULL;
         
     | 
| 
      
 220 
     | 
    
         
            +
            	
         
     | 
| 
      
 221 
     | 
    
         
            +
            	GRegex *pattern = g_regex_new(re, G_REGEX_CASELESS|G_REGEX_MULTILINE, 0, NULL);
         
     | 
| 
      
 222 
     | 
    
         
            +
            	char *t = g_regex_replace(pattern, s->str, -1, 0, sub, 0, &e);
         
     | 
| 
      
 223 
     | 
    
         
            +
            	if (e == NULL && t) {
         
     | 
| 
      
 224 
     | 
    
         
            +
            		g_string_assign(s, t);
         
     | 
| 
      
 225 
     | 
    
         
            +
            		r = TRUE;
         
     | 
| 
      
 226 
     | 
    
         
            +
            	}
         
     | 
| 
      
 227 
     | 
    
         
            +
            	
         
     | 
| 
      
 228 
     | 
    
         
            +
            	g_regex_unref(pattern);
         
     | 
| 
      
 229 
     | 
    
         
            +
            	g_free(t);
         
     | 
| 
      
 230 
     | 
    
         
            +
            	g_clear_error(&e);
         
     | 
| 
      
 231 
     | 
    
         
            +
            	return r;
         
     | 
| 
      
 232 
     | 
    
         
            +
            }
         
     |