יום שישי, ינואר 22, 2010

פעולות חוזרות בm4

אחרי שכבר למדנו שיש אפשרות לבדוק את מספר הפרמטרים , ולבדוק התאמה מה אפשר לעשות הלאה ?
כאשר כותבים קבצי הגדרות או מטהתוכנית בC פעמים רבות יש צורך לבצע את אותה הפעולה לדוגמה הוספת איבר למבנה נתונים.

אם כן אפשר להשתמש בm4 בשביל לייצר (ולמעשה זה הגישה שבוחרים כאשר משתמשים בopenser ).
לדוגמה יש צורך לבצע פעולת תנאי על כל אחד מהפרמטרים.
מכאן ששימוש בforeachq יאפשר לנו ליצור קוד כזה :

include(`foreachq.m4')dnl
define(`a', `192.168.199.1')
define(`b', `192.168.199.2')
define(`c', `192.168.199.3')
define(`d', `192.168.199.4')
define(`e', `192.168.199.5')
define(`IP', `a,b,c,d,e')
.
.
.

if (
foreachq(`x', `IP',
(is_valid(`x'))
&&
)dnl
TRUE)




מה שבתורו נותן לנו :

.
.
.
if (
(is_valid(192.168.199.1))
&&
(is_valid(192.168.199.2))
&&
(is_valid(192.168.199.3))
&&
(is_valid(192.168.199.4))
&&
(is_valid(192.168.199.5))
&&
TRUE)

אבל מה כבר זה נותן אם כותבים קוד ב C ? נניח וקיים מאגר די גדול של קבצי header שהוא לא יותר משאשר מגדיר מבני נתונים. הנקודה שלפעמים צריך להגדיר נתונים בצורה ידנית ומייגעת. (או למשל להשתמש במאקרוים שיעתפו את הנתנונים).
אחד הפתרונות הוא שימוש בm4 (כן אני יודע שזה פתרון קצת עקום) אבל הוא עושה את העבודה:
משתמשים בinclude בשביל לטעון קובץ הגדרות חדש נניח :
include (`newdefs')
ואז מבצעים פעולה על הקובץ. אמנם צריך לשמור לא לעבוד על הקובץ המרונדר (או להכניס מלל ואז לבצע פיענוח של הקובץ ולשמור אבל זה עדיין חוסך זמן).
נגיד וצריך לבצע פעולת ספירה __COUNTER__ לא כל פריפרוססור תומך בזה (וגם זה לכל התוכנית). שימוש בטכניקה של ללואת for (שלא קיימת ב C לדוגמה):

include(`forloop.m4')
define(`network',`192.168.199')
forloop(`i',`1',`254',ping `network'.`i'
)
זה טוב לפעולות מחזוריות אבל מה עם ספירה בבלוק באמת ?
באמצעות הקוד הבא ניתן לראות בקלות את היתרונות :


define(`count', `0')
define(`inc',`define(`count',incr(count))')'dnl
define(`nulli',`define(`count',`0')')'dnl

והנה עם קצת C :

printf("This step is %d\n" , inc count);
printf("This step is %d\n" , inc count);
printf("This step is %d\n" , inc count);
printf("This step is %d\n" , inc count);
nulli
//And now the counter is again restarted'
printf("This step is %d\n" , inc count);
printf("This step is %d\n" , inc count);
printf("This step is %d\n" , inc count);


אין תגובות:

הוסף רשומת תגובה