Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Procedure Übersetzung von C nach Pascal


Tankard - Mi 30.01.19 16:13
Titel: Procedure Übersetzung von C nach Pascal
Mahlzeit Leute,

meine Pascal Kenntnisse sind etwas eingerostet. Ich habe folgende Procedure in C:


Quelltext
1:
int smfi_setmlreply(SMFICTX *ctx, char *rcode, char *xcode, ...);                    


Aufgerufen wird dies wie folgt:


Quelltext
1:
2:
3:
4:
5:
ret = smfi_setmlreply(ctx, "550", "5.7.0",
            "Spammer access rejected",
            "Please see our policy at:",
            "http://www.example.com/spampolicy.html",
            NULL);


Nun möchte ich dies nach Pascal übersetzen. Die ersten Parameter sind kein Problem, nur bei dem ... wird es schwierig:


Quelltext
1:
function smfi_setmlreply (ctx:SMFICTX; rcode,xcode:PChar, ...): Integer; cdecl; external;                    


Die Punkte mag Pascal natürlich nicht. Vielleicht hat einer eine Idee.

Gruß Tankard


Delete - Mi 30.01.19 16:35

- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Mi 30.01.19 16:54

http://docwiki.embarcadero.com/RADStudio/Rio/en/Procedures_and_Functions_(Delphi)

Siehe den Punkt "External Declarations"

Zusammenfassung. Lass die Punkte weg und hänge die varargs Direktive an die Function.


Sinspin - Mi 30.01.19 17:10

Davon ausgehend das hier nicht alle Fragen von Kiddies gestellt werden die man schlicht anrotzen kann um sie vieleicht zu etwas mehr Fleiß zu ermuntern, kann man auch wie folgt Antworten.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
function smfi_setmlreply(var ctx: SMFICTX; rcode, xcode: stringconst lines: array of string): integer;
var
  l: integer;
  sl: TStringList;

begin
  sl := TStringList.Create;
  try
    // als beispiel : alle strings in eine liste
    sl.Add(rcode);
    sl.Add(xcode);
    for l := 0 to Length(lines)-1 do
      sl.Add(lines[l]);
  finally
    sl.Free;
  end;
end;

// aufruf
smfi_setmlreply(Vctx, '404''3.1415', ['Ich','bin','5','zeilen','text']);

Was in C mit den drei Punkten (Ellipse) geht muss man in Delphi als array Parameter angeben.
So wie es zum Beispiel von der Funktion Format erwartet wird.


Tankard - Mi 30.01.19 17:12

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Guten Tag Tankard,

bist du davon ausgegangen, dass die Punkte als Parameter durchgehen werden?
Schau' doch mal in der Doku [https://www.mirbsd.org/htman/i386/manDOCS/milter/smfi_setmlreply.html] nach, wofür die Punkte stellvertretend sind. ;)
Hast du eine Headerdatei diesbezüglich? Was genau ist denn der Typ "SMFICTX"?


SMFICTX ist ein einfacher Record, wo die Callback Funktionen, Name des Mailfilters etc. hinterlegt sind.

Hier geht es um einen Filter für Postfix/Sendmail. Ich würde diesen zwar lieber in C programmieren, aber leider kann mein Kunde kein C, sondern hätte gerne eine Pascal Version. Die Sourcen für die LibMilter Lib gibt es z.B. von http://ftp.sendmail.org. bzw auf github. unter :

https://github.com/jons/libmilter



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
struct smfiDesc
{
  char    *xxfi_name;  /* filter name */
  int    xxfi_version;  /* version code -- do not change */
  unsigned long  xxfi_flags;  /* flags */

  /* connection info filter */
/*  sfsistat  (*xxfi_connect) SM__P((SMFICTX *, char *, _SOCK_ADDR *));*/

  /* SMTP HELO command filter */
/*  sfsistat  (*xxfi_helo) SM__P((SMFICTX *, char *));*/

  /* envelope sender filter */
/*  sfsistat  (*xxfi_envfrom) SM__P((SMFICTX *, char **)); */

  /* envelope recipient filter */
/*  sfsistat  (*xxfi_envrcpt) SM__P((SMFICTX *, char **)); */

  /* header filter */
/*  sfsistat  (*xxfi_header) SM__P((SMFICTX *, char *, char *));*/

  /* end of header */
/*  sfsistat  (*xxfi_eoh) SM__P((SMFICTX *));*/

  /* body block */
/*  sfsistat  (*xxfi_body) SM__P((SMFICTX *, unsigned char *, size_t));*/

  /* end of message */
/*  sfsistat  (*xxfi_eom) SM__P((SMFICTX *));*/

  /* message aborted */
/*  sfsistat  (*xxfi_abort) SM__P((SMFICTX *));*/

  /* connection cleanup */
/*  sfsistat  (*xxfi_close) SM__P((SMFICTX *));*/

  /* any unrecognized or unimplemented command filter */
/*  sfsistat  (*xxfi_unknown) SM__P((SMFICTX *, const char *));*/

  /* SMTP DATA command filter */
/*  sfsistat  (*xxfi_data) SM__P((SMFICTX *)); */

  /* negotiation callback */
/*  sfsistat  (*xxfi_negotiate) SM__P((SMFICTX *,
          unsigned long, unsigned long,
          unsigned long, unsigned long,
          unsigned long *, unsigned long *,
          unsigned long *, unsigned long *));
*/
#if 0
  /* signal handler callback, not yet implemented. */
/*  int    (*xxfi_signal) SM__P((int));*/
#endif

};




user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
http://docwiki.embarcadero.com/RADStudio/Rio/en/Procedures_and_Functions_(Delphi)

Siehe den Punkt "External Declarations"

Zusammenfassung. Lass die Punkte weg und hänge die varargs Direktive an die Function.


Danke. Die kannte ich noch nicht und siehe da funktioniert sogar ;)