1/* Test file for kate's stata syntax highlighting
2*/
3*! version 1.2.0 2mar2003 E. Leuven
4program define spellsplit
5        version 7
6        syntax [anything], spell(varlist min=2 max=2) [ by(varlist)]
7        tokenize `spell'
8        local date0 `1'
9        local date1 `2'
10        local f0 : format `date0'
11        local f1 : format `date1'
12
13        /* set default statistic */
14        local current "mean"
15
16        gettoken left anything : anything, match(prns)
17        while "`left'"!="" {
18                if "`prns'"!="" {
19                        if !inlist("`left'","mean","sum") {
20                                di as error "Statistic `left' not supported"
21                                exit 198
22                        }
23                        local current "`left'"
24                }
25                else {
26                        local `current'vars  ``current'vars' `left'
27                }
28                gettoken left anything : anything, match(prns)
29        }
30        if ("`meanvars'"!="") {
31                confirm var `meanvars'
32                unab meanvars : `meanvars'
33        }
34        if ("`sumvars'"!="") {
35                confirm var `sumvars'
36                unab sumvars : `sumvars'
37        }
38
39        quietly {
40                g _count = 1
41                local xvars `meanvars' `sumvars' _count
42
43                /* create dummy by-var if no by option is specified */
44                if "`by'"=="" {
45                        tempvar by
46                        g byte `by' = 1
47                }
48                tempvar `xvars' `by'
49
50                /* create negative for subtraction when spell ends */
51                cap foreach v of varlist `xvars' {
52                        g double ``v'' = -`v'
53                        local txvars `txvars' ``v''
54                }
55                cap foreach v of varlist `by' {
56                        g double ``v'' = `v'
57                        local txvars `txvars' ``v''
58                }
59
60                stack `date0' `xvars' `by' `date1' `txvars', into(`date0' `xvars' `by') clear
61
62                /* calculate totals per date */
63                cap foreach v of varlist `xvars' {
64                        egen double ``v'' = sum(`v'), by(`by' `date0')
65                }
66
67                /* unique dates only */
68                by `by' `date0', sort: keep if _n==1
69
70                /* calculate totals (+ when spell starts - when ends) */
71                sort `by'
72                cap foreach v of varlist `xvars' {
73                        by `by': replace `v' = sum(``v'')
74                }
75                by `by': g `date1' = `date0'[_n + 1]
76
77                drop if `date0'>`date1'
78                drop _stack
79                drop if _count==0
80                order `by' `date0' `date1' `xvars'
81                format `date0' `f0'
82                format `date1' `f1'
83
84                cap for var `meanvars': replace X = X/_count
85
86                compress
87        }
88
89end