diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 6b59b4cd..c8a2d40d 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -24,6 +24,11 @@ # # Please keep this list alphabetized. +ABAP: + type: programming + lexer: ABAP + primary_extension: .abap + ASP: type: programming color: "#6a40fd" diff --git a/samples/ABAP/cl_csv_parser.abap b/samples/ABAP/cl_csv_parser.abap new file mode 100644 index 00000000..2b32d047 --- /dev/null +++ b/samples/ABAP/cl_csv_parser.abap @@ -0,0 +1,219 @@ +*/** +* The MIT License (MIT) +* Copyright (c) 2012 René van Mil +* +* 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. +*/ + +*----------------------------------------------------------------------* +* CLASS CL_CSV_PARSER DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +class cl_csv_parser definition + public + inheriting from cl_object + final + create public . + + public section. +*"* public components of class CL_CSV_PARSER +*"* do not include other source files here!!! + + type-pools abap . + methods constructor + importing + !delegate type ref to if_csv_parser_delegate + !csvstring type string + !separator type c + !skip_first_line type abap_bool . + methods parse + raising + cx_csv_parse_error . + protected section. +*"* protected components of class CL_CSV_PARSER +*"* do not include other source files here!!! + private section. +*"* private components of class CL_CSV_PARSER +*"* do not include other source files here!!! + + constants _textindicator type c value '"'. "#EC NOTEXT + data _delegate type ref to if_csv_parser_delegate . + data _csvstring type string . + data _separator type c . + type-pools abap . + data _skip_first_line type abap_bool . + + methods _lines + returning + value(returning) type stringtab . + methods _parse_line + importing + !line type string + returning + value(returning) type stringtab + raising + cx_csv_parse_error . +endclass. "CL_CSV_PARSER DEFINITION + + + +*----------------------------------------------------------------------* +* CLASS CL_CSV_PARSER IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +class cl_csv_parser implementation. + + +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method CL_CSV_PARSER->CONSTRUCTOR +* +-------------------------------------------------------------------------------------------------+ +* | [--->] DELEGATE TYPE REF TO IF_CSV_PARSER_DELEGATE +* | [--->] CSVSTRING TYPE STRING +* | [--->] SEPARATOR TYPE C +* | [--->] SKIP_FIRST_LINE TYPE ABAP_BOOL +* +-------------------------------------------------------------------------------------- + method constructor. + super->constructor( ). + _delegate = delegate. + _csvstring = csvstring. + _separator = separator. + _skip_first_line = skip_first_line. + endmethod. "constructor + + +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method CL_CSV_PARSER->PARSE +* +-------------------------------------------------------------------------------------------------+ +* | [!CX!] CX_CSV_PARSE_ERROR +* +-------------------------------------------------------------------------------------- + method parse. + data msg type string. + if _csvstring is initial. + message e002(csv) into msg. + raise exception type cx_csv_parse_error + exporting + message = msg. + endif. + + " Get the lines + data is_first_line type abap_bool value abap_true. + data lines type standard table of string. + lines = _lines( ). + field-symbols type string. + loop at lines assigning . + " Should we skip the first line? + if _skip_first_line = abap_true and is_first_line = abap_true. + is_first_line = abap_false. + continue. + endif. + " Parse the line + data values type standard table of string. + values = _parse_line( ). + " Send values to delegate + _delegate->values_found( values ). + endloop. + endmethod. "parse + + +* ---------------------------------------------------------------------------------------+ +* | Instance Private Method CL_CSV_PARSER->_LINES +* +-------------------------------------------------------------------------------------------------+ +* | [<-()] RETURNING TYPE STRINGTAB +* +-------------------------------------------------------------------------------------- + method _lines. + split _csvstring at cl_abap_char_utilities=>cr_lf into table returning. + endmethod. "_lines + + +* ---------------------------------------------------------------------------------------+ +* | Instance Private Method CL_CSV_PARSER->_PARSE_LINE +* +-------------------------------------------------------------------------------------------------+ +* | [--->] LINE TYPE STRING +* | [<-()] RETURNING TYPE STRINGTAB +* | [!CX!] CX_CSV_PARSE_ERROR +* +-------------------------------------------------------------------------------------- + method _parse_line. + data msg type string. + + data csvvalue type string. + data csvvalues type standard table of string. + + data char type c. + data pos type i value 0. + data len type i. + len = strlen( line ). + while pos < len. + char = line+pos(1). + if char <> _separator. + if char = _textindicator. + data text_ended type abap_bool. + text_ended = abap_false. + while text_ended = abap_false. + pos = pos + 1. + if pos < len. + char = line+pos(1). + if char = _textindicator. + text_ended = abap_true. + else. + if char is initial. " Space + concatenate csvvalue ` ` into csvvalue. + else. + concatenate csvvalue char into csvvalue. + endif. + endif. + else. + " Reached the end of the line while inside a text value + " This indicates an error in the CSV formatting + text_ended = abap_true. + message e003(csv) into msg. + raise exception type cx_csv_parse_error + exporting + message = msg. + endif. + endwhile. + " Check if next character is a separator, otherwise the CSV formatting is incorrect + data nextpos type i. + nextpos = pos + 1. + if nextpos < len and line+nextpos(1) <> _separator. + message e003(csv) into msg. + raise exception type cx_csv_parse_error + exporting + message = msg. + endif. + else. + if char is initial. " Space + concatenate csvvalue ` ` into csvvalue. + else. + concatenate csvvalue char into csvvalue. + endif. + endif. + else. + append csvvalue to csvvalues. + clear csvvalue. + endif. + pos = pos + 1. + endwhile. + append csvvalue to csvvalues. " Don't forget the last value + + returning = csvvalues. + endmethod. "_parse_line +endclass. "CL_CSV_PARSER IMPLEMENTATION \ No newline at end of file