Mercurial > hgrepos > Python2 > PyMuPDF
diff mupdf-source/thirdparty/tesseract/src/cutil/oldlist.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/cutil/oldlist.cpp Mon Sep 15 11:43:07 2025 +0200 @@ -0,0 +1,220 @@ +/****************************************************************************** +# +# File: oldlist.cpp +# Description: List processing procedures. +# Author: Mark Seaman, Software Productivity +# +# (c) Copyright 1987, Hewlett-Packard Company. +** 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. +# +############################################################################### + + This file contains a set of general purpose list manipulation routines. + These routines can be used in a wide variety of ways to provide several + different popular data structures. A new list can be created by declaring + a variable of type 'LIST', and can be initialized with the value 'NIL_LIST'. + All of these routines check for the NIL_LIST condition before dereferencing + pointers. NOTE: There is a users' manual available in printed form from + Mark Seaman at (303) 350-4492 at Greeley Hard Copy. + + To implement a STACK use: + + push to add to the Stack l = push(l, (LIST)"jim"); + pop to remove items from the Stack l = pop(l); + first_node to access the head name = (char *)first_node(l); + + To implement a QUEUE use: + + push_last to add to the Queue l = push_last(l, (LIST)"x"); + pop remove items from the Queue l = pop(l); + first_node to access the head name = (char *)first_node (l); + + To implement LISP like functions use: + + first_node CAR x = (int)first_node(l); + rest CDR l = list_rest (l); + push CONS l = push(l, (LIST)this); + last LAST x = last(l); + concat APPEND l = concat(r, s); + count LENGTH x = count(l); + search MEMBER if (search(l, x, nullptr)) + + The following rules of closure exist for the functions provided. + a = first_node (push (a, b)) + b = list_rest (push (a, b)) + a = push (pop (a), a)) For all a <> NIL_LIST + a = reverse (reverse (a)) + +******************************************************************************/ +#include "oldlist.h" + +#include "errcode.h" // for ASSERT_HOST + +#include <cstdio> +#include <cstring> // for strcmp + +namespace tesseract { + +/*---------------------------------------------------------------------- + F u n c t i o n s +----------------------------------------------------------------------*/ + +/********************************************************************** + * i s s a m e + * + * Compare the list node with the key value return true (non-zero) + * if they are equivalent strings. (Return false if not) + **********************************************************************/ +static int is_same(void *item1, void *item2) { + return strcmp(static_cast<char *>(item1), static_cast<char *>(item2)) == 0; +} + +/********************************************************************** + * d e l e t e d + * + * Delete all the elements out of the current list that match the key. + * This operation destroys the original list. The caller will supply a + * routine that will compare each node to the + * key, and return a non-zero value when they match. + **********************************************************************/ +LIST delete_d(LIST list, void *key, int_compare is_equal) { + LIST result = NIL_LIST; + LIST last_one = NIL_LIST; + + if (is_equal == nullptr) { + is_equal = is_same; + } + + while (list != NIL_LIST) { + if (!(*is_equal)(list->first_node(), key)) { + if (last_one == NIL_LIST) { + last_one = list; + list = list->list_rest(); + result = last_one; + set_rest(last_one, NIL_LIST); + } else { + set_rest(last_one, list); + last_one = list; + list = list->list_rest(); + set_rest(last_one, NIL_LIST); + } + } else { + list = pop(list); + } + } + return (result); +} + +/********************************************************************** + * d e s t r o y + * + * Return the space taken by a list to the heap. + **********************************************************************/ +LIST destroy(LIST list) { + LIST next; + + while (list != NIL_LIST) { + next = list->list_rest(); + delete list; + list = next; + } + return (NIL_LIST); +} + +/********************************************************************** + * d e s t r o y n o d e s + * + * Return the space taken by the LISTs of a list to the heap. + **********************************************************************/ +void destroy_nodes(LIST list, void_dest destructor) { + ASSERT_HOST(destructor != nullptr); + + while (list != NIL_LIST) { + if (list->first_node() != nullptr) { + (*destructor)(list->first_node()); + } + list = pop(list); + } +} + +/********************************************************************** + * l a s t + * + * Return the last list item (this is list type). + **********************************************************************/ +LIST last(LIST var_list) { + while (var_list->list_rest() != NIL_LIST) { + var_list = var_list->list_rest(); + } + return var_list; +} + +/********************************************************************** + * p o p + * + * Return the list with the first element removed. Destroy the space + * that it occupied in the list. + **********************************************************************/ +LIST pop(LIST list) { + LIST temp = list->list_rest(); + delete list; + return temp; +} + +/********************************************************************** + * p u s h + * + * Create a list element. Push the second parameter (the node) onto + * the first parameter (the list). Return the new list to the caller. + **********************************************************************/ +LIST push(LIST list, void *element) { + LIST t; + + t = new list_rec; + t->node = static_cast<LIST>(element); + set_rest(t, list); + return (t); +} + +/********************************************************************** + * p u s h l a s t + * + * Create a list element. Add the element onto the end of the list. + **********************************************************************/ +LIST push_last(LIST list, void *item) { + LIST t; + + if (list != NIL_LIST) { + t = last(list); + t->next = push(NIL_LIST, item); + return (list); + } else { + return (push(NIL_LIST, item)); + } +} + +/********************************************************************** + * s e a r c h + * + * Search list, return NIL_LIST if not found. Return the list starting from + * the item if found. The compare routine "is_equal" is passed in as + * the third parameter to this routine. + **********************************************************************/ +LIST search(LIST list, void *key, int_compare is_equal) { + if (is_equal == nullptr) { + is_equal = is_same; + } + + iterate(list) if ((*is_equal)(list->first_node(), key)) return list; + return (NIL_LIST); +} + +} // namespace tesseract
