.\" -*- coding: UTF-8 -*- .\" Copyright 1993, The Regents of the University of California. .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: BSD-3-Clause .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH TAILQ 3 "17 مايو 2025" "صفحات دليل لينكس 6.18" .SH الاسم .\"TAILQ_FOREACH_FROM, .\"TAILQ_FOREACH_FROM_SAFE, .\"TAILQ_FOREACH_REVERSE_FROM, .\"TAILQ_FOREACH_REVERSE_FROM_SAFE, .\"TAILQ_FOREACH_REVERSE_SAFE, .\"TAILQ_FOREACH_SAFE, .\"TAILQ_SWAP TAILQ_CONCAT, TAILQ_EMPTY, TAILQ_ENTRY, TAILQ_FIRST, TAILQ_FOREACH, TAILQ_FOREACH_REVERSE, TAILQ_HEAD, TAILQ_HEAD_INITIALIZER, TAILQ_INIT, TAILQ_INSERT_AFTER, TAILQ_INSERT_BEFORE, TAILQ_INSERT_HEAD, TAILQ_INSERT_TAIL, TAILQ_LAST, TAILQ_NEXT, TAILQ_PREV, TAILQ_REMOVE \- تنفيذ طابور ذيل مزدوج الوصل .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBTAILQ_ENTRY(TYPE);\fP .P \fBTAILQ_HEAD(HEADNAME, TYPE);\fP \fBTAILQ_HEAD TAILQ_HEAD_INITIALIZER(TAILQ_HEAD \fP\fIhead\fP\fB);\fP \fBvoid TAILQ_INIT(TAILQ_HEAD *\fP\fIhead\fP\fB);\fP .P \fBint TAILQ_EMPTY(TAILQ_HEAD *\fP\fIhead\fP\fB);\fP .P \fBvoid TAILQ_INSERT_HEAD(TAILQ_HEAD *\fP\fIhead\fP\fB,\fP \fB struct TYPE *\fP\fIelm\fP\fB, TAILQ_ENTRY \fP\fINAME\fP\fB);\fP \fBvoid TAILQ_INSERT_TAIL(TAILQ_HEAD *\fP\fIhead\fP\fB,\fP \fB struct TYPE *\fP\fIelm\fP\fB, TAILQ_ENTRY \fP\fINAME\fP\fB);\fP \fBvoid TAILQ_INSERT_BEFORE(struct TYPE *\fP\fIlistelm\fP\fB,\fP \fB struct TYPE *\fP\fIelm\fP\fB, TAILQ_ENTRY \fP\fINAME\fP\fB);\fP \fBvoid TAILQ_INSERT_AFTER(TAILQ_HEAD *\fP\fIhead\fP\fB, struct TYPE *\fP\fIlistelm\fP\fB,\fP \fB struct TYPE *\fP\fIelm\fP\fB, TAILQ_ENTRY \fP\fINAME\fP\fB);\fP .P \fBstruct TYPE *TAILQ_FIRST(TAILQ_HEAD *\fP\fIhead\fP\fB);\fP \fBstruct TYPE *TAILQ_LAST(TAILQ_HEAD *\fP\fIhead\fP\fB, HEADNAME);\fP \fBstruct TYPE *TAILQ_PREV(struct TYPE *\fP\fIelm\fP\fB, HEADNAME, TAILQ_ENTRY \fP\fINAME\fP\fB);\fP \fBstruct TYPE *TAILQ_NEXT(struct TYPE *\fP\fIelm\fP\fB, TAILQ_ENTRY \fP\fINAME\fP\fB);\fP .P .\" .BI "TAILQ_FOREACH_FROM(struct TYPE *" var ", TAILQ_HEAD *" head , .\" .BI " TAILQ_ENTRY " NAME ); .\" .BI "TAILQ_FOREACH_REVERSE_FROM(struct TYPE *" var ", TAILQ_HEAD *" head ", HEADNAME," .\" .BI " TAILQ_ENTRY " NAME ); .\" .P .\" .BI "TAILQ_FOREACH_SAFE(struct TYPE *" var ", TAILQ_HEAD *" head , .\" .BI " TAILQ_ENTRY " NAME , .\" .BI " struct TYPE *" temp_var ); .\" .BI "TAILQ_FOREACH_FROM_SAFE(struct TYPE *" var ", TAILQ_HEAD *" head , .\" .BI " TAILQ_ENTRY " NAME , .\" .BI " struct TYPE *" temp_var ); .\" .BI "TAILQ_FOREACH_REVERSE_SAFE(struct TYPE *" var ", TAILQ_HEAD *" head , .\" .BI " HEADNAME, TAILQ_ENTRY " NAME , .\" .BI " struct TYPE *" temp_var ); .\" .BI "TAILQ_FOREACH_REVERSE_FROM_SAFE(struct TYPE *" var ", TAILQ_HEAD *" head , .\" .BI " HEADNAME, TAILQ_ENTRY " NAME , .\" .BI " struct TYPE *" temp_var ); \fBTAILQ_FOREACH(struct TYPE *\fP\fIvar\fP\fB, TAILQ_HEAD *\fP\fIhead\fP\fB,\fP \fB TAILQ_ENTRY \fP\fINAME\fP\fB);\fP \fBTAILQ_FOREACH_REVERSE(struct TYPE *\fP\fIvar\fP\fB, TAILQ_HEAD *\fP\fIhead\fP\fB, HEADNAME,\fP \fB TAILQ_ENTRY \fP\fINAME\fP\fB);\fP .P \fBvoid TAILQ_REMOVE(TAILQ_HEAD *\fP\fIhead\fP\fB, struct TYPE *\fP\fIelm\fP\fB,\fP \fB TAILQ_ENTRY \fP\fINAME\fP\fB);\fP .P .\" .BI "void TAILQ_SWAP(TAILQ_HEAD *" head1 ", TAILQ_HEAD *" head2 ", TYPE," .\" .BI " TAILQ_ENTRY " NAME ); \fBvoid TAILQ_CONCAT(TAILQ_HEAD *\fP\fIhead1\fP\fB, TAILQ_HEAD *\fP\fIhead2\fP\fB,\fP \fB TAILQ_ENTRY \fP\fINAME\fP\fB);\fP .fi .SH الوصف تُعرِّف هذه الكليّات وتُشغّل على طوابير ذيل مزدوجة الوصل. .P في تعريفات الكليّات، \fITYPE\fP هو اسم بنية مُعرَّفة من المستخدم، يجب أن تحتوي على حقل من نوع \fITAILQ_ENTRY\fP، اسمه \fINAME\fP. المعامل \fIHEADNAME\fP هو اسم بنية مُعرَّفة من المستخدم يجب أن تُصرَّح باستخدام الكلية \fBTAILQ_HEAD\fP(). .SS الإنشاء يترأس طابور الذيل بنية مُعرَّفة بالكلية \fBTAILQ_HEAD\fP(). تحتوي هذه البنية على زوج من المؤشرات، واحد إلى أول عنصر في الطابور والآخر إلى آخر عنصر في الطابور. العناصر مزدوجة الوصل بحيث يمكن إزالة أي عنصر دون اجتياز الطابور. يمكن إضافة عناصر جديدة إلى الطابور بعد عنصر موجود، أو قبل عنصر موجود، أو في رأس الطابور، أو في نهاية الطابور. تُصرَّح بنية \fITAILQ_HEAD\fP كالتالي: .P .in +4 .EX TAILQ_HEAD(HEADNAME, TYPE) head; .EE .in .P حيث \fIstruct HEADNAME\fP هي البنية المراد تعريفها، و \fIstruct TYPE\fP هو نوع العناصر المراد ربطها في الطابور. يمكن لاحقًا التصريح عن مؤشر لرأس الطابور كـ: .P .in +4 .EX struct HEADNAME *headp; .EE .in .P (الاسمان \fIhead\fP و \fIheadp\fP يمكن للمستخدم اختيارهما.) .P تُصرِّح \fBTAILQ_ENTRY\fP() ببنية تربط العناصر في الطابور. .P تُقيِّم \fBTAILQ_HEAD_INITIALIZER\fP() إلى مُهيِّئ للطابور \fIhead\fP. .P تهيئ \fBTAILQ_INIT\fP() الطابور المُشار إليه بـ .P تُقيِّم \fBTAILQ_EMPTY\fP() إلى صواب إذا لم تكن هناك عناصر في الطابور. \fIhead\fP. .SS إدراج تُدرج \fBTAILQ_INSERT_HEAD\fP() العنصر الجديد \fIelm\fP في رأس الطابور. .P تُدرج \fBTAILQ_INSERT_TAIL\fP() العنصر الجديد \fIelm\fP في نهاية الطابور. .P تُدرج \fBTAILQ_INSERT_BEFORE\fP() العنصر الجديد \fIelm\fP قبل العنصر \fIlistelm\fP. .P تدرج \fBTAILQ_INSERT_AFTER\fP() العنصر الجديد \fIelm\fP بعد العنصر \fIlistelm\fP. .SS اجتياز ترجع \fBTAILQ_FIRST\fP() أول عنصر في الطابور، أو NULL إذا كان الطابور فارغًا. .P ترجع \fBTAILQ_LAST\fP() آخر عنصر في الطابور. إذا كان الطابور فارغًا، تكون القيمة المرجعة NULL. .P ترجع \fBTAILQ_PREV\fP() العنصر السابق في الطابور، أو NULL إذا كان هذا العنصر هو الأول. .P ترجع \fBTAILQ_NEXT\fP() العنصر التالي في الطابور، أو NULL إذا كان هذا العنصر هو الأخير. .P .\" .P .\" .BR TAILQ_FOREACH_FROM () .\" behaves identically to .\" .BR TAILQ_FOREACH () .\" when .\" .I var .\" is NULL, else it treats .\" .I var .\" as a previously found TAILQ element and begins the loop at .\" .I var .\" instead of the first element in the TAILQ referenced by .\" .IR head . تعبر \fBTAILQ_FOREACH\fP() الطابور المشار إليه بـ \fIhead\fP في الاتجاه الأمامي، مع تخصيص كل عنصر بدوره إلى \fIvar\fP. يُضبط \fIvar\fP إلى NULL إذا اكتملت الحلقة بشكل طبيعي، أو إذا لم تكن هناك عناصر. .P .\" .P .\" .BR TAILQ_FOREACH_REVERSE_FROM () .\" behaves identically to .\" .BR TAILQ_FOREACH_REVERSE () .\" when .\" .I var .\" is NULL, else it treats .\" .I var .\" as a previously found TAILQ element and begins the reverse loop at .\" .I var .\" instead of the last element in the TAILQ referenced by .\" .IR head . .\" .P .\" .BR TAILQ_FOREACH_SAFE () .\" and .\" .BR TAILQ_FOREACH_REVERSE_SAFE () .\" traverse the list referenced by .\" .I head .\" in the forward or reverse direction respectively, .\" assigning each element in turn to .\" .IR var . .\" However, unlike their unsafe counterparts, .\" .BR TAILQ_FOREACH () .\" and .\" .BR TAILQ_FOREACH_REVERSE () .\" permit to both remove .\" .I var .\" as well as free it from within the loop safely without interfering with the .\" traversal. .\" .P .\" .BR TAILQ_FOREACH_FROM_SAFE () .\" behaves identically to .\" .BR TAILQ_FOREACH_SAFE () .\" when .\" .I var .\" is NULL, else it treats .\" .I var .\" as a previously found TAILQ element and begins the loop at .\" .I var .\" instead of the first element in the TAILQ referenced by .\" .IR head . .\" .P .\" .BR TAILQ_FOREACH_REVERSE_FROM_SAFE () .\" behaves identically to .\" .BR TAILQ_FOREACH_REVERSE_SAFE () .\" when .\" .I var .\" is NULL, else it treats .\" .I var .\" as a previously found TAILQ element and begins the reverse loop at .\" .I var .\" instead of the last element in the TAILQ referenced by .\" .IR head . تعبر \fBTAILQ_FOREACH_REVERSE\fP() الطابور المشار إليه بـ \fIhead\fP في الاتجاه العكسي، مع تخصيص كل عنصر بدوره إلى \fIvar\fP. .SS إزالة تزيل \fBTAILQ_REMOVE\fP() العنصر \fIelm\fP من الطابور. .SS "ميزات أخرى" .\" .BR TAILQ_SWAP () .\" swaps the contents of .\" .I head1 .\" and .\" .IR head2 . .\" .P تسلسل \fBTAILQ_CONCAT\fP() الطابور الذي يرأسه \fIhead2\fP إلى نهاية الطابور الذي يرأسه \fIhead1\fP مع إزالة جميع الإدخالات من الأول. .SH "قيمة الإرجاع" ترجع \fBTAILQ_EMPTY\fP() قيمة غير صفرية إذا كان الطابور فارغًا، وصفرًا إذا كان الطابور يحتوي على إدخال واحد على الأقل. .P ترجع \fBTAILQ_FIRST\fP() و\fBTAILQ_LAST\fP() و\fBTAILQ_PREV\fP() و\fBTAILQ_NEXT\fP() مؤشرًا إلى بنية \fITYPE\fP الأولى أو الأخيرة أو السابقة أو التالية، على التوالي. .P ترجع \fBTAILQ_HEAD_INITIALIZER\fP() مُهيئًا يمكن تخصيصه للطابور \fIhead\fP. .SH المعايير BSD. .SH التاريخ 4.4BSD. .SH تحذيرات لا تسمح \fBTAILQ_FOREACH\fP() و\fBTAILQ_FOREACH_REVERSE\fP() بإزالة أو تحرير \fIvar\fP داخل الحلقة، لأن ذلك سيتداخل مع العبور. تعمل \fBTAILQ_FOREACH_SAFE\fP() و\fBTAILQ_FOREACH_REVERSE_SAFE\fP()، الموجودتان في أنظمة BSD ولكن غير موجودتين في glibc، على إصلاح هذا القيد بالسماح بإزالة \fIvar\fP بأمان من القائمة وتحريره من داخل الحلقة دون التداخل مع العبور. .SH أمثلة .\" SRC BEGIN (tailq.c) .EX #include #include #include #include \& struct entry { int data; TAILQ_ENTRY(entry) entries; /* Tail queue */ }; \& TAILQ_HEAD(tailhead, entry); \& int main(void) { struct entry *n1, *n2, *n3, *np; struct tailhead head; /* Tail queue head */ int i; \& TAILQ_INIT(&head); /* Initialize the queue */ \& n1 = malloc(sizeof(struct entry)); /* Insert at the head */ TAILQ_INSERT_HEAD(&head, n1, entries); \& n1 = malloc(sizeof(struct entry)); /* Insert at the tail */ TAILQ_INSERT_TAIL(&head, n1, entries); \& n2 = malloc(sizeof(struct entry)); /* Insert after */ TAILQ_INSERT_AFTER(&head, n1, n2, entries); \& n3 = malloc(sizeof(struct entry)); /* Insert before */ TAILQ_INSERT_BEFORE(n2, n3, entries); \& TAILQ_REMOVE(&head, n2, entries); /* Deletion */ free(n2); /* Forward traversal */ i = 0; TAILQ_FOREACH(np, &head, entries) np\->data = i++; /* Reverse traversal */ TAILQ_FOREACH_REVERSE(np, &head, tailhead, entries) printf("%i\[rs]n", np\->data); /* TailQ deletion */ n1 = TAILQ_FIRST(&head); while (n1 != NULL) { n2 = TAILQ_NEXT(n1, entries); free(n1); n1 = n2; } TAILQ_INIT(&head); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBinsque\fP(3)، \fBqueue\fP(7) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .