Asterisk AEL: Return Value beim Macro funktioniert nicht?

donfaustino

Neuer User
Mitglied seit
28 Nov 2004
Beiträge
143
Punkte für Reaktionen
0
Punkte
0
Hi,
ich habe meinen Dialplan komplett in AEL. Jetzt bin ich dabei mehrfach verwendeten Code in Macros zu modularisieren. Klappt auch soweit, nur wenn ich im Macro einen Rückgabewert ausgeben will gibt es einen Fehler.
Ich habe aber gelesen dass dieses Feature Anfang letzten Jahres mit in den AEL-Code geflossen sein soll.

Code:
macro repair_callnumber ( mycallnumber ) {
   callnumber=${mycallnumber};

   if ("${callnumber:0:1}" = "+") {
     callnumber=00${callnumber:1};
   }

   if ("${callnumber:0:2}" != "00" & "${callnumber:0:1}" = "0" ) {
     callnumber=0049${callnumber:1};
   }
   return(${callnumber});
}
Code:
[Mar 24 13:35:32] ERROR[1161]: ael.y:840 ael_yyerror: ==== File: /etc/asterisk/extensions.ael, Line 105, Cols: 10-10: Error: syntax error, unexpected '(', expecting ';'
Ich habe diese Asterisk Version:
Code:
Iconnect*CLI> core show version
Asterisk 1.6.2.9-2+squeeze4 built by buildd @ alwyn on a armv5tel running Linux on 2011-12-18 21:54:01 UTC
Iconnect*CLI>
Mache ich was falsch? Oder ist meine Version zu alt? System ist aber up-to-date....
 
Zuletzt bearbeitet:
R

rentier-s

Guest
Verwende statt Macro besser gleich Gosub, da funktioniert return(value) seit 1.6.
 

donfaustino

Neuer User
Mitglied seit
28 Nov 2004
Beiträge
143
Punkte für Reaktionen
0
Punkte
0
danke für die Info. Funktioniert GoSub auch in AEL?
 
R

rentier-s

Guest
Äh ja natürlich. Es ist sogar anders rum, in AEL gibt es eigentlich gar kein Macro.
 

donfaustino

Neuer User
Mitglied seit
28 Nov 2004
Beiträge
143
Punkte für Reaktionen
0
Punkte
0
hmm, sorry, ich find kein Beispiel wie ich GoSub in der extension.ael einbauen kann...
So gehts zb. nicht:
Code:
sub_test {
   NoOp(Test);
}
.....
.....
context test {
  _X. => {
      gosub(sub_test);
   }
}
 
R

rentier-s

Guest
Aus dem Kopf geschrieben:

Code:
[COLOR="#FF0000"]context[/COLOR] sub_test {
  [COLOR="#FF0000"]s =>[/COLOR] {
    NoOp(Test);
    Return(noch mehr Test);
  }
}

context test {
  _X. => {
    gosub(sub_test[COLOR="#FF0000"],s,1[/COLOR]);
    NoOp(${GOSUB_RESULT});
  }
}
 

noway0815

Neuer User
Mitglied seit
12 Mai 2006
Beiträge
117
Punkte für Reaktionen
0
Punkte
16
Es ist besser macros zu benutzen, da mann parameter übergeben kann.

Aufruf:
Code:
&getGateway(${CalledNum}, gw);

macro getGateway(Number, *gw){
	gw="";
	switch (${Number}){
		pattern 00201X.: gw=thisAccount; break;
		pattern 0020NX.: gw=ThatAccount; break;
		pattern 001X.  :
		pattern 0086X. :
		pattern 00971X.: gw=orThisAccount; break;
		        default: gw=thisAccount;
	}

	return;
}
Gruß
Noway
 
Zuletzt bearbeitet:
R

rentier-s

Guest
Dann schau mal, was der AEL Parser aus dem Macro macht ;-)
 

noway0815

Neuer User
Mitglied seit
12 Mai 2006
Beiträge
117
Punkte für Reaktionen
0
Punkte
16
was der Parser daraus macht ist völlig egal. Es geht so und funktioniert sehr zuverlässig seit Jahren bei mir.
 

abw1oim

Aktives Mitglied
Mitglied seit
26 Mrz 2007
Beiträge
956
Punkte für Reaktionen
4
Punkte
18
Nur dass die Annahme, an Gosub könnten keine Parameter übergeben werden, falsch ist ...

Code:
Gosub(<context>,<exten>,<prio>[(ARG1,ARG2,...,ARGn)])
Und: Macro ist ab 1.8 deprecated - wird zwar nicht zurückgebaut -, soll aber ausdrücklich nur im Zusammenhang mit der features.conf verwendet werden, wenn eine komplexere Funktion benötigt wird!

Und: AEL und Macro sind inkompatibel, der Parser übersetzt das in einen "normalen" Kontext (interessanterweise eben ein Gosub). "Echte" Macros können in AEL nicht formuliert werden, sie lassen sich nur über die "klassische" extensions.conf abbilden (und sind und bleiben dann auch "echte" Macros).
 

3CX PBX - GRATIS
Linux / Win / Cloud

Neueste Beiträge

Statistik des Forums

Themen
234,009
Beiträge
2,041,493
Mitglieder
353,285
Neuestes Mitglied
aquahornet