1 /* 2 Copyright (C) 1993-1998, 2001-2023 Free Software Foundation, Inc. 3 4 This program is free software: you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation, either version 3 of the License, or (at 7 your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program. If not, see <https://www.gnu.org/licenses/>. */ 16 17 /* This file implements the emacs_insque and emacs_remque functions, 18 clones of the insque and remque functions of BSD. They and all 19 their callers have been renamed to emacs_mumble to allow us to 20 include this file in the menu library on all systems. */ 21 22 #include "XMenuInt.h" 23 24 struct qelem { 25 struct qelem *q_forw; 26 struct qelem *q_back; 27 char q_data[1]; 28 }; 29 30 /* Insert ELEM into a doubly-linked list, after PREV. */ 31 32 void 33 emacs_insque (void *velem, void *vprev) 34 { 35 struct qelem *elem = velem; 36 struct qelem *prev = vprev; 37 struct qelem *next = prev->q_forw; 38 prev->q_forw = elem; 39 if (next) 40 next->q_back = elem; 41 elem->q_forw = next; 42 elem->q_back = prev; 43 } 44 45 /* Unlink ELEM from the doubly-linked list that it is in. */ 46 47 void 48 emacs_remque (void *velem) 49 { 50 struct qelem *elem = velem; 51 struct qelem *next = elem->q_forw; 52 struct qelem *prev = elem->q_back; 53 if (next) 54 next->q_back = prev; 55 if (prev) 56 prev->q_forw = next; 57 }