staload _(*anon*) = "libc/SATS/stdio.sats"//staload _(*anon*) = "prelude/DATS/array.dats"staload _(*anon*) = "prelude/DATS/array0.dats"//staload _(*anon*) = "prelude/DATS/list.dats"staload _(*anon*) = "prelude/DATS/list0.dats"staload _(*anon*) = "prelude/DATS/list_vt.dats"//staload _(*anon*) = "prelude/DATS/matrix.dats"staload _(*anon*) = "prelude/DATS/matrix0.dats"//staload _(*anon*) = "prelude/DATS/option.dats"staload _(*anon*) = "prelude/DATS/option0.dats"//staload _(*anon*) = "prelude/DATS/pointer.dats"//staload _(*anon*) = "prelude/DATS/reference.dats"//(* ****** ****** *)
staloadUN = "prelude/SATS/unsafe.sats"
(* ****** ****** *)
staload "libc/SATS/stdio.sats"
(* ****** ****** *)
viewdef bytes_v (l:addr, n:int) = bytes (n) @ l
externfun ptr0_add_bytesize (p: ptr, ofs: size_t):<> ptr
implementptr0_add_bytesize(p,ofs) = p+ofs
symintr ptr_succ
externfunptr0_succ (p: ptr):<> ptroverload ptr_succ with ptr0_succ
externfunptr1_succ {l:addr} (p: ptr l):<> ptr (l+1)overload ptr_succ with ptr1_succ
implementptr1_succ {l} (p) =$UN.cast{ptr(l+1)}(ptr0_succ (p)) implementptr0_succ (p) = ptr0_add_bytesize (p, 1)
externpraxibytes_v_unsplit {l:addr}{n1,n2:int} (pf1: (bytes_v (l, n1), bytes_v (l+n1, n2))): bytes_v (l, n1+n2)// end of [bytes_v_unsplit]
(* ****** ****** *)
%{^externvoid*rawmemchr(const void *s, int c);#define atslib_rawmemchr rawmemchr%}
externfun rawmemchr {l:addr}{m:int}( pf: bytes_v (l, m) | p: ptr l, c: int) : [l2:addr | l+m > l2]( bytes_v (l, l2-l), bytes_v (l2, l+m-l2) | ptr l2) = "mac#atslib_rawmemchr" // end of [rawmemchr]
(* ****** ****** *)
#define BUFSZ 16384
(* ****** ****** *)
extern fun fread1 {l:addr} {n:nat} {f:fm} (pf_mod: file_mode r | dest: ptr l, sz: size_t 1, count: size_t n, fil: FILEref) : [m:nat] size_t m = "mac#fread"
externfun freadc // read bytes and then add [c] at the end {b:nat} {l:addr}( pf: !bytes_v (l, BUFSZ) | inp: FILEref, p: ptr l, c: char, b: size_t b) : size_t // end of [freadc]
implementfreadc (pf | inp, p, c, b) = let val [m:int] m = fread1(file_mode_r | p, 1, b, inp) val () = assertloc (p > null)// val _ = if p <> null then val () = $UN.ptrset<char> (p+m, c) // else ()in mend (* end of [freadc] *)
(* ****** ****** *)
externfun wclbuf {l:addr}{n:int}( pf: !bytes_v (l, n) | p: ptr l, pz: ptr, c: int, res: int) : int // end of [wclbuf]
implementwclbuf (pf | p, pz, c, res) =( if p < pz then let val (pf1, pf2 | p2) = rawmemchr (pf | p, c) prval (pf21, pf22) = array_v_uncons (pf2) val _ = $showtype p val p2 = ptr_succ(p2) val _ = $showtype p val res = wclbuf (pf22 | p2, pz, c, res + 1) prval () = pf2 := array_v_cons (pf21, pf22) prval () = pf := bytes_v_unsplit (pf1, pf2) in res end else res // end of [if]) // end of [wcbuf]
(* ****** ****** *)
externfun wclfil{l:addr}( pf: !bytes_v (l, BUFSZ) | inp: FILEref, p: ptr l, c: int) : int // end of [wclfil]implementwclfil{l} (pf | inp, p, c) = let//fun loop( pf: !bytes_v (l, BUFSZ)| inp: FILEref, p: ptr l, c: int, res: int) : int = let//val n = freadc (pf | inp, p, $UN.cast{char}(c), size1_of_int1(BUFSZ-1))//in//if n > 0 then let //val pz = ptr_add<char> (p, n) val pz = p+n val res = wclbuf (pf | p, pz, c, res)in loop (pf | inp, p, c, res)end else res (* end of [if] *)//end // end of [loop]//in loop (pf | inp, p, c, 0(*res*))end (* end of [wclfil] *)
(* ****** ****** *)
implementmain {n} (argc, argv) = () where {var inp: FILEref = stdin_refval () =(if argc >= 2 then inp := fopen_ref_exn (argv[1], file_mode_r)// end of [if])//val ( pfopt | p) = malloc_ngc (BUFSZ)val () = assert_errmsg (p > null, #LOCATION)prval malloc_v_succ (pf_ngc, pf_buf) = pfoptprval () = pf_buf := bytes_v_of_b0ytes_v (pf_buf)val res = wclfil (pf_buf | inp, p, $UN.cast2int('\n'))val () = free_ngc (pf_ngc, pf_buf | p)//val () = println! ("wclines: number of lines = ", res)//val () = if argc >= 2 then fclose_exn (inp)} (* end of [main0] *)
(* ****** ****** *)
(* end of [wclines.dats] *)
brandon@gulab:/media/RAID5/share/ATS_learning$ make -f Makefile_wclines_a2 gcc -std=c99 -D_GNU_SOURCE -O2 -I"/media/RAID5/share/ATS_learning/ATS-Postiats" -I"/media/RAID5/share/ATS_learning/ATS-Postiats"/ccomp/runtime -DATS_MEMALLOC_LIBC -o wclines_a2.exe wclines_a2_dats.c -L"/media/RAID5/share/ATS_learning/ATS-Postiats"/ccomp/atslib/lib -latslibwclines_a2_dats.c:139:1: warning: data definition has no type or storage class [enabled by default]wclines_a2_dats.c:139:1: warning: type defaults to ‘int’ in declaration of ‘ATSdyncst_unknown’ [enabled by default]wclines_a2_dats.c:139:1: warning: parameter names (without types) in function declaration [enabled by default]wclines_a2_dats.c: In function ‘ATSLIB_056$prelude_ptr0_succ$12$1’:wclines_a2_dats.c:487:1: error: ‘atstype_byte’ undeclared (first use in this function)wclines_a2_dats.c:487:1: note: each undeclared identifier is reported only once for each function it appears inwclines_a2_dats.c: In function ‘mainats_argc_argv_0’:wclines_a2_dats.c:790:1: error: ‘ATSLIB_056$prelude_file_mode_r’ undeclared (first use in this function)make: *** [wclines_a2.exe] Error 1
(***** A fast approach to counting newlines**** Author: Hongwei Xi (hwxi AT cs DOT bu DOT edu)** Time: April 17, 2013**
*)(* ****** ****** *)
//#include"share/atspre_staload_tmpdef.hats"
//(* ****** ****** *)
staloadUN = "prelude/SATS/unsafe.sats"
(* ****** ****** *)
staload "libc/SATS/stdio.sats"
(* ****** ****** *)
//extern//praxi b0ytes2bytes_v {bsz:int}// {l:addr} (pf: b0ytes (bsz) @ l):<prf> bytes (bsz) @ l
externpraxibytes_v_unsplit {l:addr}{n1,n2:int}
(pf: bytes_v (l, n1), bytes_v (l+n1, n2)): bytes_v (l, n1+n2)
// end of [bytes_v_unsplit]
(* ****** ****** *)
%{^externvoid*rawmemchr(const void *s, int c);#define atslib_rawmemchr rawmemchr%}externfun rawmemchr {l:addr}{m:int}( pf: bytes_v (l, m) | p: ptr l, c: int) : [l2:addr | l+m > l2]( bytes_v (l, l2-l), bytes_v (l2, l+m-l2) | ptr l2) = "mac#atslib_rawmemchr" // end of [rawmemchr]
(* ****** ****** *)
#define BUFSZ (16*1024)
(* ****** ****** *)
extern
fun freadc // read bytes and then add [c] at the end
{l:addr}( pf: !bytes_v (l, BUFSZ) | inp: FILEref, p: ptr l, c: char
) : [n:nat] size_t n // end of [freadc]
implementfreadc (pf | inp, p, c) = let val n = $extfcall ([n:nat] size_t n, "fread", p, sizeof<char>, BUFSZ-1, inp) val () = $UN.ptr0_set<char> (ptr_add<char> (p, n), c)in n
end (* end of [freadc] *)
(* ****** ****** *)
externfun wclbuf {l:addr}{n:int}( pf: !bytes_v (l, n) | p: ptr l, pz: ptr, c: int, res: int) : int // end of [wclbuf]
implement
wclbuf (pf | p, pz, c, res) = let
val (pf1, pf2 | p2) = rawmemchr (pf | p, c)
in//if p2 < pz then let
prval (pf21, pf22) = array_v_uncons (pf2)
val res = wclbuf (pf22 | ptr_succ<byte>(p2), pz, c, res + 1)
prval () = pf2 := array_v_cons (pf21, pf22) prval () = pf := bytes_v_unsplit (pf1, pf2)in res
end else let
prval () = pf := bytes_v_unsplit (pf1, pf2)in res
end // end of [if]//end (* end of [wcbuf] *)
(* ****** ****** *)
extern
fun wclfil{l:addr}( pf: !bytes_v (l, BUFSZ) | inp: FILEref, p: ptr l, c: int) : int // end of [wclfil]implementwclfil{l} (pf | inp, p, c) = let//fun loop( pf: !bytes_v (l, BUFSZ)| inp: FILEref, p: ptr l, c: int, res: int) : int = let//
val n = freadc (pf | inp, p, $UN.cast{char}(c))
//in//if n > 0 then let
val pz = ptr_add<char> (p, n)
//val () = assertloc (p > null)
val nEOF = if n < (BUFSZ-1) then (if ($UN.ptr0_get<char> (ptr_add<char> (p,sz2i(n)-1))) = '\n' then 0 else 1) else 0 // end of [nEOF]
val res = wclbuf (pf | p, pz, c, res)in loop (pf | inp, p, c, res)end else res (* end of [if] *)//end // end of [loop]//in loop (pf | inp, p, c, 0(*res*))end (* end of [wclfil] *)
(* ****** ****** *)
implement
main0 (argc, argv) =
{var inp: FILEref = stdin_refval () =(if argc >= 2 then inp := fopen_ref_exn (argv[1], file_mode_r)// end of [if])//val (
pfat, pfgc | p) = malloc_gc (g1i2u(BUFSZ))prval () = pfat := b0ytes2bytes_v (pfat)val res = wclfil (pfat | inp, p, $UN.cast2int('\n'))val () = mfree_gc (pfat, pfgc | p)
fun loop( pf: !bytes_v (l, BUFSZ)
| inp: FILEref, p: ptr l, c: int, res: int, last_c: int
) : int = let//val n = freadc (pf | inp, p, $UN.cast{char}(c))//in//if n > 0 then let val pz = ptr_add<char> (p, n)
val last_c = $UN.cast2int($UN.ptr0_get<char> (ptr_add<char> (p,sz2i(n)-1))) val res = wclbuf (pf | p, pz, c, res (*+nEOF*))in loop (pf | inp, p, c, res, last_c)end else if last_c = c then res else res+1 (* end of [if n > 0] *)
externfun wclfil{l:addr}
( pf: !bytes_v (l, BUFSZ) | inp: FILEref, p: ptr l, c: int
) : int // end of [wclfil]
implementwclfil{l} (pf | inp, p, c) = let//
fun loop {n:nat}
( pf: !bytes_v (l, BUFSZ)
| inp: FILEref, p: ptr l, c: int, res: int, last_n: size_t n
) : int = let//
//val n = freadc (pf | inp, p, $UN.cast{char}(c), size1_of_int1(BUFSZ-1))val n = freadc (pf | inp, p, $UN.cast{char}(c), size1_of_int1(BUFSZ))
//in//if n > 0 then let
//val pz = ptr_add<char> (p, n)
val () = assertloc (p > null)
val pz = p+n val res = wclbuf (pf | p, pz, c, res)in loop (pf | inp, p, c, res, n)end else (* else of [if n > 0] *) (if last_n > 0 then (if $UN.cast2int($UN.ptrget<char> (p+last_n-1)) = c then res else res + 1):int else 0):int
//end // end of [loop]
//in loop (pf | inp, p, c, 0(*res*), size1_of_int1(0) (*last_n*))