CQL_WARN_UNUSED cql_code compare_lines()

in sources/linetester/linetest.c [381:509]


CQL_WARN_UNUSED cql_code compare_lines(sqlite3 *_Nonnull _db_, cql_int32 *_Nonnull procs, cql_int32 *_Nonnull compares, cql_int32 *_Nonnull errors) {
  cql_contract_argument_notnull((void *)procs, 1);
  cql_contract_argument_notnull((void *)compares, 2);
  cql_contract_argument_notnull((void *)errors, 3);

  cql_code _rc_ = SQLITE_OK;
  sqlite3_stmt *p_stmt = NULL;
  compare_lines_p_row p = { ._refs_count_ = 1, ._refs_offset_ = compare_lines_p_refs_offset };
  sqlite3_stmt *actual_stmt = NULL;
  compare_lines_actual_row actual = { ._refs_count_ = 3, ._refs_offset_ = compare_lines_actual_refs_offset };
  sqlite3_stmt *expected_stmt = NULL;
  compare_lines_expected_row expected = { ._refs_count_ = 3, ._refs_offset_ = compare_lines_expected_refs_offset };

  *procs = 0; // set out arg to non-garbage
  *compares = 0; // set out arg to non-garbage
  *errors = 0; // set out arg to non-garbage
  _rc_ = cql_prepare(_db_, &p_stmt,
    "SELECT procname "
      "FROM procs");
  if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
  for (;;) {
    _rc_ = sqlite3_step(p_stmt);
    p._has_row_ = _rc_ == SQLITE_ROW;
    cql_multifetch(_rc_, p_stmt, 1,
                   CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &p.procname);
    if (_rc_ != SQLITE_ROW && _rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
    if (!p._has_row_) break;
    *procs = (*procs) + 1;
    cql_finalize_stmt(&actual_stmt);
    _rc_ = cql_prepare(_db_, &actual_stmt,
      "SELECT source, procname, line, data, physical_line "
        "FROM linedata "
        "WHERE source = 'act' AND procname = ?");
    cql_multibind(&_rc_, _db_, &actual_stmt, 1,
                  CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, p.procname);
    if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
    cql_finalize_stmt(&expected_stmt);
    _rc_ = cql_prepare(_db_, &expected_stmt,
      "SELECT source, procname, line, data, physical_line "
        "FROM linedata "
        "WHERE source = 'exp' AND procname = ?");
    cql_multibind(&_rc_, _db_, &expected_stmt, 1,
                  CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, p.procname);
    if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
    _rc_ = sqlite3_step(actual_stmt);
    actual._has_row_ = _rc_ == SQLITE_ROW;
    cql_multifetch(_rc_, actual_stmt, 5,
                   CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &actual.source,
                   CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &actual.procname,
                   CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &actual.line,
                   CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &actual.data,
                   CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &actual.physical_line);
    if (_rc_ != SQLITE_ROW && _rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
    _rc_ = sqlite3_step(expected_stmt);
    expected._has_row_ = _rc_ == SQLITE_ROW;
    cql_multifetch(_rc_, expected_stmt, 5,
                   CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &expected.source,
                   CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &expected.procname,
                   CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &expected.line,
                   CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &expected.data,
                   CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &expected.physical_line);
    if (_rc_ != SQLITE_ROW && _rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
    for (;;) {
    if (!(actual._has_row_ && expected._has_row_)) break;
      *compares = (*compares) + 1;
      if (actual.line != expected.line || cql_string_compare(actual.data, expected.data) != 0) {
        _rc_ = dump(_db_, p.procname);
        if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
        printf("\nFirst difference:\n");
        cql_alloc_cstr(_cstr_6, expected.data);
        printf("expected: %5d %s\n", expected.line, _cstr_6);
        cql_free_cstr(_cstr_6, expected.data);
        cql_alloc_cstr(_cstr_7, actual.data);
        printf("  actual: %5d %s\n", actual.line, _cstr_7);
        cql_free_cstr(_cstr_7, actual.data);
        printf("\nDifferences at:\n line %d in expected\n line %d in actual", expected.physical_line, actual.physical_line);
        printf("\n");
        *errors = (*errors) + 1;
        break;
      }
      _rc_ = sqlite3_step(actual_stmt);
      actual._has_row_ = _rc_ == SQLITE_ROW;
      cql_multifetch(_rc_, actual_stmt, 5,
                     CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &actual.source,
                     CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &actual.procname,
                     CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &actual.line,
                     CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &actual.data,
                     CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &actual.physical_line);
      if (_rc_ != SQLITE_ROW && _rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
      _rc_ = sqlite3_step(expected_stmt);
      expected._has_row_ = _rc_ == SQLITE_ROW;
      cql_multifetch(_rc_, expected_stmt, 5,
                     CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &expected.source,
                     CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &expected.procname,
                     CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &expected.line,
                     CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &expected.data,
                     CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &expected.physical_line);
      if (_rc_ != SQLITE_ROW && _rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
    }
    if (actual._has_row_ != expected._has_row_) {
      if (! actual._has_row_) {
        _rc_ = dump(_db_, p.procname);
        if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
        printf("\nRan out of lines in actual:\n");
        printf("\nDifferences at:\n line %d in expected\n", expected.physical_line);
        printf("\n");
        *errors = (*errors) + 1;
      }
      if (! expected._has_row_) {
        _rc_ = dump(_db_, p.procname);
        if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
        printf("\nRan out of lines in expected:\n");
        printf("\nDifferences at:\n line %d in actual\n", actual.physical_line);
        printf("\n");
        *errors = (*errors) + 1;
      }
    }
  }
  _rc_ = SQLITE_OK;

cql_cleanup:
  cql_finalize_stmt(&p_stmt);
  cql_teardown_row(p);
  cql_finalize_stmt(&actual_stmt);
  cql_teardown_row(actual);
  cql_finalize_stmt(&expected_stmt);
  cql_teardown_row(expected);
  return _rc_;
}