diff mupdf-source/thirdparty/tesseract/src/ccutil/params.cpp @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mupdf-source/thirdparty/tesseract/src/ccutil/params.cpp	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,210 @@
+/**********************************************************************
+ * File:        params.cpp
+ * Description: Initialization and setting of Tesseract parameters.
+ * Author:      Ray Smith
+ *
+ * (C) Copyright 1991, Hewlett-Packard Ltd.
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ *
+ **********************************************************************/
+
+#include "params.h"
+
+#include "helpers.h"  // for chomp_string
+#include "host.h"     // tesseract/export.h, windows.h for MAX_PATH
+#include "serialis.h" // for TFile
+#include "tprintf.h"
+
+#include <climits> // for INT_MIN, INT_MAX
+#include <cmath>   // for NAN, std::isnan
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <locale>  // for std::locale::classic
+#include <sstream> // for std::stringstream
+
+namespace tesseract {
+
+tesseract::ParamsVectors *GlobalParams() {
+  static tesseract::ParamsVectors global_params = tesseract::ParamsVectors();
+  return &global_params;
+}
+
+bool ParamUtils::ReadParamsFile(const char *file, SetParamConstraint constraint,
+                                ParamsVectors *member_params) {
+  TFile fp;
+  if (!fp.Open(file, nullptr)) {
+    tprintf("read_params_file: Can't open %s\n", file);
+    return true;
+  }
+  return ReadParamsFromFp(constraint, &fp, member_params);
+}
+
+bool ParamUtils::ReadParamsFromFp(SetParamConstraint constraint, TFile *fp,
+                                  ParamsVectors *member_params) {
+  char line[MAX_PATH]; // input line
+  bool anyerr = false; // true if any error
+  bool foundit;        // found parameter
+  char *valptr;        // value field
+
+  while (fp->FGets(line, MAX_PATH) != nullptr) {
+    if (line[0] != '\r' && line[0] != '\n' && line[0] != '#') {
+      chomp_string(line); // remove newline
+      for (valptr = line; *valptr && *valptr != ' ' && *valptr != '\t'; valptr++) {
+        ;
+      }
+      if (*valptr) {    // found blank
+        *valptr = '\0'; // make name a string
+        do {
+          valptr++; // find end of blanks
+        } while (*valptr == ' ' || *valptr == '\t');
+      }
+      foundit = SetParam(line, valptr, constraint, member_params);
+
+      if (!foundit) {
+        anyerr = true; // had an error
+        tprintf("Warning: Parameter not found: %s\n", line);
+      }
+    }
+  }
+  return anyerr;
+}
+
+bool ParamUtils::SetParam(const char *name, const char *value, SetParamConstraint constraint,
+                          ParamsVectors *member_params) {
+  // Look for the parameter among string parameters.
+  auto *sp =
+      FindParam<StringParam>(name, GlobalParams()->string_params, member_params->string_params);
+  if (sp != nullptr && sp->constraint_ok(constraint)) {
+    sp->set_value(value);
+  }
+  if (*value == '\0') {
+    return (sp != nullptr);
+  }
+
+  // Look for the parameter among int parameters.
+  auto *ip = FindParam<IntParam>(name, GlobalParams()->int_params, member_params->int_params);
+  if (ip && ip->constraint_ok(constraint)) {
+    int intval = INT_MIN;
+    std::stringstream stream(value);
+    stream.imbue(std::locale::classic());
+    stream >> intval;
+    if (intval != INT_MIN) {
+      ip->set_value(intval);
+    }
+  }
+
+  // Look for the parameter among bool parameters.
+  auto *bp = FindParam<BoolParam>(name, GlobalParams()->bool_params, member_params->bool_params);
+  if (bp != nullptr && bp->constraint_ok(constraint)) {
+    if (*value == 'T' || *value == 't' || *value == 'Y' || *value == 'y' || *value == '1') {
+      bp->set_value(true);
+    } else if (*value == 'F' || *value == 'f' || *value == 'N' || *value == 'n' || *value == '0') {
+      bp->set_value(false);
+    }
+  }
+
+  // Look for the parameter among double parameters.
+  auto *dp =
+      FindParam<DoubleParam>(name, GlobalParams()->double_params, member_params->double_params);
+  if (dp != nullptr && dp->constraint_ok(constraint)) {
+    double doubleval = NAN;
+    std::stringstream stream(value);
+    stream.imbue(std::locale::classic());
+    stream >> doubleval;
+    if (!std::isnan(doubleval)) {
+      dp->set_value(doubleval);
+    }
+  }
+  return (sp || ip || bp || dp);
+}
+
+bool ParamUtils::GetParamAsString(const char *name, const ParamsVectors *member_params,
+                                  std::string *value) {
+  // Look for the parameter among string parameters.
+  auto *sp =
+      FindParam<StringParam>(name, GlobalParams()->string_params, member_params->string_params);
+  if (sp) {
+    *value = sp->c_str();
+    return true;
+  }
+  // Look for the parameter among int parameters.
+  auto *ip = FindParam<IntParam>(name, GlobalParams()->int_params, member_params->int_params);
+  if (ip) {
+    *value = std::to_string(int32_t(*ip));
+    return true;
+  }
+  // Look for the parameter among bool parameters.
+  auto *bp = FindParam<BoolParam>(name, GlobalParams()->bool_params, member_params->bool_params);
+  if (bp != nullptr) {
+    *value = bool(*bp) ? "1" : "0";
+    return true;
+  }
+  // Look for the parameter among double parameters.
+  auto *dp =
+      FindParam<DoubleParam>(name, GlobalParams()->double_params, member_params->double_params);
+  if (dp != nullptr) {
+    std::ostringstream stream;
+    stream.imbue(std::locale::classic());
+    stream << double(*dp);
+    *value = stream.str();
+    return true;
+  }
+  return false;
+}
+
+void ParamUtils::PrintParams(FILE *fp, const ParamsVectors *member_params) {
+  int num_iterations = (member_params == nullptr) ? 1 : 2;
+  std::ostringstream stream;
+  stream.imbue(std::locale::classic());
+  for (int v = 0; v < num_iterations; ++v) {
+    const ParamsVectors *vec = (v == 0) ? GlobalParams() : member_params;
+    for (auto int_param : vec->int_params) {
+      stream << int_param->name_str() << '\t' << (int32_t)(*int_param) << '\t'
+             << int_param->info_str() << '\n';
+    }
+    for (auto bool_param : vec->bool_params) {
+      stream << bool_param->name_str() << '\t' << bool(*bool_param) << '\t'
+             << bool_param->info_str() << '\n';
+    }
+    for (auto string_param : vec->string_params) {
+      stream << string_param->name_str() << '\t' << string_param->c_str() << '\t'
+             << string_param->info_str() << '\n';
+    }
+    for (auto double_param : vec->double_params) {
+      stream << double_param->name_str() << '\t' << (double)(*double_param) << '\t'
+             << double_param->info_str() << '\n';
+    }
+  }
+  fprintf(fp, "%s", stream.str().c_str());
+}
+
+// Resets all parameters back to default values;
+void ParamUtils::ResetToDefaults(ParamsVectors *member_params) {
+  int num_iterations = (member_params == nullptr) ? 1 : 2;
+  for (int v = 0; v < num_iterations; ++v) {
+    ParamsVectors *vec = (v == 0) ? GlobalParams() : member_params;
+    for (auto &param : vec->int_params) {
+      param->ResetToDefault();
+    }
+    for (auto &param : vec->bool_params) {
+      param->ResetToDefault();
+    }
+    for (auto &param : vec->string_params) {
+      param->ResetToDefault();
+    }
+    for (auto &param : vec->double_params) {
+      param->ResetToDefault();
+    }
+  }
+}
+
+} // namespace tesseract