mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			180 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| (*
 | |
| * The MIT License (MIT)
 | |
| *
 | |
| * Copyright (c) 2014 Hongwei Xi
 | |
| *
 | |
| * Permission is hereby granted, free of charge, to any person obtaining a copy
 | |
| * of this software and associated documentation files (the "Software"), to deal
 | |
| * in the Software without restriction, including without limitation the rights
 | |
| * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | |
| * copies of the Software, and to permit persons to whom the Software is
 | |
| * furnished to do so, subject to the following conditions:
 | |
| *
 | |
| * The above copyright notice and this permission notice shall be included in all
 | |
| * copies or substantial portions of the Software.
 | |
| *
 | |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | |
| * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | |
| * SOFTWARE.)
 | |
| *)
 | |
| 
 | |
| // Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/0f26aa0df8542d2ae21df9be1e13208f66f571d6/contrib/libats-/hwxi/teaching/mygrading/HATS/csv_parse.hats
 | |
| 
 | |
| (* ****** ****** *)
 | |
| //
 | |
| // Author: Hongwei Xi
 | |
| // Authoremail: gmhwxiATgmailDOTcom
 | |
| // Start time: the first of July, 2016
 | |
| //
 | |
| (* ****** ****** *)
 | |
| //
 | |
| #ifdef
 | |
| MYGRADING_HATS
 | |
| #then
 | |
| #else
 | |
| //
 | |
| extern
 | |
| fun
 | |
| csv_parse_line
 | |
| (
 | |
|   line: string
 | |
| ) : List0_vt(Strptr1)
 | |
| //
 | |
| #endif // #ifdef
 | |
| //
 | |
| (* ****** ****** *)
 | |
| 
 | |
| local
 | |
| //
 | |
| staload
 | |
| UN = "prelude/SATS/unsafe.sats"
 | |
| //
 | |
| extern
 | |
| fun{}
 | |
| getpos(): int
 | |
| //
 | |
| extern
 | |
| fun{}
 | |
| is_end(): bool
 | |
| //
 | |
| extern
 | |
| fun{}
 | |
| char_at(): int
 | |
| //
 | |
| extern
 | |
| fun{}
 | |
| Strptr1_at(i0: int): Strptr1
 | |
| //
 | |
| extern
 | |
| fun{}
 | |
| rmove(): void
 | |
| extern
 | |
| fun{}
 | |
| rmove_while(test: char -<cloref1> bool): void
 | |
| //
 | |
| in (* in-of-local *)
 | |
| //
 | |
| implement
 | |
| {}(*tmp*)
 | |
| rmove_while
 | |
|   (test) = let
 | |
| //
 | |
| val c0 = char_at()
 | |
| //
 | |
| in
 | |
| //
 | |
| if c0 >= 0 then
 | |
|   if test(int2char0(c0)) then (rmove(); rmove_while(test)) else ()
 | |
| // end of [if]
 | |
| //
 | |
| end // end of [rmove_while]
 | |
| 
 | |
| (* ****** ****** *)
 | |
| 
 | |
| implement
 | |
| csv_parse_line
 | |
|   (line) = let
 | |
| //
 | |
| val line = g1ofg0(line)
 | |
| //
 | |
| var i: int = 0
 | |
| val p_i = addr@i
 | |
| //
 | |
| val n0 = sz2i(length(line))
 | |
| //
 | |
| macdef get_i() = $UN.ptr0_get<int>(p_i)
 | |
| macdef inc_i() = $UN.ptr0_addby<int>(p_i, 1)
 | |
| macdef set_i(i0) = $UN.ptr0_set<int>(p_i, ,(i0))
 | |
| //
 | |
| implement
 | |
| getpos<>() = get_i()
 | |
| //
 | |
| implement
 | |
| is_end<>() = get_i() >= n0
 | |
| //
 | |
| implement
 | |
| char_at<>() = let
 | |
|   val i = get_i()
 | |
|   val i = ckastloc_gintGte(i, 0)
 | |
| //
 | |
| in
 | |
|   if i < n0 then char2u2int0(line[i]) else ~1
 | |
| end // end of [char_at]
 | |
| //
 | |
| implement
 | |
| Strptr1_at<>(i0) = let
 | |
| //
 | |
|   val i1 = get_i()
 | |
|   val i0 = ckastloc_gintGte(i0, 0)
 | |
|   val i1 = ckastloc_gintBtwe(i1, i0, n0)
 | |
| //
 | |
| in
 | |
|   $UN.castvwtp0(
 | |
|     string_make_substring(line, i2sz(i0), i2sz(i1-i0))
 | |
|   ) (* $UN.castvwtp0 *)
 | |
| end // end of [Strptr1_at]
 | |
| //
 | |
| implement
 | |
| rmove<>() =
 | |
|   if get_i() < n0 then inc_i()
 | |
| //
 | |
| vtypedef res_vt = List0_vt(Strptr1)
 | |
| //
 | |
| fun
 | |
| loop
 | |
| (
 | |
|   i: int, res: res_vt
 | |
| ) : res_vt =
 | |
| if
 | |
| is_end()
 | |
| then res
 | |
| else let
 | |
|   val () =
 | |
|   (
 | |
|     if i > 0 then rmove()
 | |
|   )
 | |
|   val i0 = getpos()
 | |
|   var f0 =
 | |
|   (
 | |
|     lam@(c: char) =<clo> c != ','
 | |
|   )
 | |
|   val () = rmove_while($UN.cast(addr@f0))
 | |
|   val s0 = Strptr1_at(i0)
 | |
| in
 | |
|   loop(i+1, list_vt_cons(s0, res))
 | |
| end // end of [else]
 | |
| //
 | |
| in
 | |
|   list_vt_reverse(loop(0(*i*), list_vt_nil((*void*))))
 | |
| end // end of [csv_parse_line]
 | |
| 
 | |
| end // end of [local]
 | |
| 
 | |
| (* ****** ****** *)
 | |
| 
 | |
| (* end of [csv_parse.hats] *)
 |