Mercurial Hosting > luan
annotate src/luan/modules/parsers/Csv.java @ 1267:9fa8b8389578
add LuanTable.luan;
support metatable __gc();
add luan.sql;
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 12 Nov 2018 02:10:41 -0700 |
parents | 88b5b81cad4a |
children | f41919741100 |
rev | line source |
---|---|
585 | 1 package luan.modules.parsers; |
2 | |
1267 | 3 import luan.LuanState; |
585 | 4 import luan.LuanTable; |
1111
88b5b81cad4a
move Parser to luan.lib.parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
5 import luan.lib.parser.Parser; |
88b5b81cad4a
move Parser to luan.lib.parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
6 import luan.lib.parser.ParseException; |
585 | 7 |
8 | |
9 public final class Csv { | |
10 | |
1267 | 11 public static LuanTable toList(LuanState luan,String line) throws ParseException { |
12 return new Csv(line).parse(luan); | |
585 | 13 } |
14 | |
15 private final Parser parser; | |
16 | |
17 private Csv(String line) { | |
18 this.parser = new Parser(line); | |
19 } | |
20 | |
21 private ParseException exception(String msg) { | |
22 return new ParseException(parser,msg); | |
23 } | |
24 | |
1267 | 25 private LuanTable parse(LuanState luan) throws ParseException { |
26 LuanTable list = new LuanTable(luan); | |
585 | 27 while(true) { |
28 Spaces(); | |
29 String field = parseField(); | |
30 list.rawPut(list.rawLength()+1,field); | |
31 Spaces(); | |
32 if( parser.endOfInput() ) | |
33 return list; | |
34 if( !parser.match(',') ) | |
35 throw exception("unexpected char"); | |
36 } | |
37 } | |
38 | |
39 private String parseField() throws ParseException { | |
40 parser.begin(); | |
41 String rtn; | |
42 if( parser.match('"') ) { | |
43 int start = parser.currentIndex(); | |
44 do { | |
45 if( parser.endOfInput() ) { | |
46 parser.failure(); | |
47 throw exception("unclosed quote"); | |
48 } | |
49 } while( parser.noneOf("\"") ); | |
50 rtn = parser.textFrom(start); | |
51 parser.match('"'); | |
52 } else { | |
53 int start = parser.currentIndex(); | |
54 while( !parser.endOfInput() && parser.noneOf(",") ); | |
55 rtn = parser.textFrom(start).trim(); | |
56 } | |
57 return parser.success(rtn); | |
58 } | |
59 | |
60 private void Spaces() { | |
61 while( parser.anyOf(" \t") ); | |
62 } | |
63 | |
64 } |