This file is indexed.

/usr/share/ecere/extras/CSVDataParser.ec is in ecere-extras 0.44.15-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
public import "ecere"
public import "CSVParser"

import "timeTools"

public enum ColumnType { null = 1, string = 2, number = 4, floater = 8, date = 12 };
public const String columnTypeNames[ColumnType] = { "", "Null", "String", "", "Number", "", "", "", "Float", "", "", "", "Date" };

public class Column : struct
{
   ColumnType type;
   char * s;
   union
   {
      int i;
      float f;
      DateTime d;
   };

   ~Column()
   {
      delete s;
   }
}

public class CSVDataParser : public CSVParser
{
public:
   ColumnType * columnsTypes;
   int rowCount;
   Array<Column> columns { };

   virtual bool OnRow();

   void Process()
   {
      rowCount = 0;
      CSVParser::Process();
   }

   bool OnRowStrings(Array<String> strings)
   {
      bool status = true;
      int c = 0;

      for(s : strings)
      {
         Column column;
         if(s)
         {
            int len;
            char * str;
            buffer.size = strlen(s) * 3 + 1;
            len = ISO8859_1toUTF8(s, buffer.array, buffer.size);
            str = new char[len + 1];
            memcpy(str, buffer.array, len + 1);
            column = Column { s = str };
         }
         else
            column = Column { s = CopyString("") };
         switch(columnsTypes[c])
         {
            case date:
            {
               DateTime d { };
               d.OnGetDataFromString(s);
               column.type = date;
               if(d.month >= january && d.month <= december)
                  column.d = d;
               else
               {
                  ::Print/*Ln*/("bdate"/*"BAD DATE -- FIXME FIXME -- ", s*/);
                  column.d = { };
               }
               break;
            }
            case floater:
               column.type = floater;
               column.f = (float)strtod(s, null);
               break;
            case number:
               column.type = number;
               column.i = strtol(s, null, 10);
               break;
            case null|string:
            case string:
               column.type = string;
               break;
         }
         switch(columnsTypes[c])
         {
            case date:
            case floater:
            case number:
            case null|string:
            case null:
            case string:
               columns.Add(column);
               break;
            default:
               ::PrintLn("WHAT'S GOING ON?", s);
               break;
         }
         if(++c >= options.expectedFieldCount) break;
      }
      rowCount++;
      status = OnRow();
      columns.Free();
      return status;
   }

private:
   Array<char> buffer { minAllocSize = 1024 };
}