OSSP CVS Repository

ossp - Check-in [238]
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [Patchset]  [Tagging/Branching

Check-in Number: 238
Date: 2000-Dec-15 13:38:21 (local)
2000-Dec-15 12:38:21 (UTC)
User:simons
Branch:
Comment: Initial revision
Tickets:
Inspections:
Files:
ossp-pkg/petidomo/librfc822/address.y      added-> 1.1

ossp-pkg/petidomo/librfc822/address.y -> 1.1

*** /dev/null    Sat Nov 23 06:27:22 2024
--- -    Sat Nov 23 06:28:22 2024
***************
*** 0 ****
--- 1,180 ----
+ /*
+  *      $Source: /v/ossp/cvs/ossp-pkg/petidomo/librfc822/address.y,v $
+  *      $Revision: 1.1 $
+  *      $Date: 2000/12/16 12:38:21 $
+  *
+  *      Copyright (C) 1997 by CyberSolutions GmbH.
+  *      All rights reserved.
+  */
+ 
+ %{
+     /* Definitions we need in the parser. */
+ 
+ #include <errno.h>
+ #ifdef DEBUG_DMALLOC
+ #  include <dmalloc.h>
+ #endif
+ 
+ #include "../libmpools/mpools.h"
+ #define yytext rfc822_text
+ #define yyley rfc822_lex
+ 
+     /* Variables in our lexer. */
+ 
+ extern char *   rfc822_address_buffer;
+ extern int      rfc822_address_buffer_pos;
+ extern char *   yytext;
+ 
+     /* Our static/global variables. */
+ 
+ static int     no_memory_flag;
+ static char *  poolname,
+             *  result_hostpart,
+             *  result_localpart,
+            *  result_address;
+ 
+     /* Prototypes for internal functions. */
+ 
+ static int     yyparse(void);
+ static int     yyerror(char *);
+ static char *  pool_strdup(char *);
+ static char *  pool_strjoin(char *, char *);
+ int            yylex(void);
+ 
+     /* These macros call the routines we define later in a fail safe
+        way. */
+ 
+ #define str_dup(target,a) { \
+     target = (YYSTYPE) pool_strdup((char *) a); \
+     if (target == NULL) { \
+         no_memory_flag++; \
+         YYABORT; \
+     } \
+ }
+ 
+ #define str_join(target,a,b) { \
+     target = (YYSTYPE) pool_strjoin((char *) a, (char *) b); \
+     if (target == NULL) { \
+         no_memory_flag++; \
+         YYABORT; \
+     } \
+ }
+ 
+ %}
+ %token TOK_ATOM TOK_ILLEGAL
+ %left ':'
+ %left '@'
+ %%
+ 
+ address:   local                       {
+                                          result_localpart = (char *)$1;
+                                          str_dup($$,$1);
+                                          result_address = (char *)$$;
+                                        }
+         | local at domain              {
+                                          result_localpart = (char *)$1;
+                                          result_hostpart = (char *)$3;
+                                          str_join($$,$1,$2); str_join($$,$$,$3);
+                                          result_address = (char *)$$;
+                                        }
+         | at domain colon sourceroutings local {
+                                          result_hostpart = (char *)$2;
+                                          str_join($$,$4,$5);
+                                          result_localpart = (char *)$$;
+                                          str_join($$,$3,$$); str_join($$,$2,$$);
+                                          str_join($$,$1,$$);
+                                          result_address = (char *)$$;
+                                        }
+         | at domain colon sourceroutings local at domain {
+                                          result_hostpart = (char *)$2;
+                                          str_join($$,$4,$5); str_join($$,$$,$6);
+                                          str_join($$,$$,$7);
+                                          result_localpart = (char *)$$;
+                                          str_join($$,$3,$$); str_join($$,$2,$$);
+                                          str_join($$,$1,$$);
+                                          result_address = (char *)$$;
+                                        }
+ ;
+ 
+ sourceroutings:          /* empty */           { $$ = (YYSTYPE) NULL; }
+                | at domain colon sourceroutings {
+                                          str_join($$,$1,$2); str_join($$,$$,$3);
+                                          str_join($$,$$,$4);
+                                        }
+ 
+ local:   atom                          { $$ = $1; }
+        | atom local                    { str_join($$,$1,$2); }
+        | dot                           { $$ = $1; }
+        | dot local                     { str_join($$,$1,$2); }
+ ;
+ 
+ domain:   atom                         { $$ = $1; }
+        | atom dot domain               { str_join($$,$2,$3); str_join($$,$1,$$); }
+ ;
+ 
+ atom:    TOK_ATOM                      { str_dup($$,yytext); }
+ dot:     '.'                           { $$ = (YYSTYPE) "."; }
+ at:      '@'                           { $$ = (YYSTYPE) "@"; }
+ colon:   ':'                           { $$ = (YYSTYPE) ":"; }
+ 
+ %%
+ /***** internal routines *****/
+ 
+ static int
+ yyerror(char * string)
+ {
+     return 0;
+ }
+ 
+ /* Do the same as strdup(3) but use the memory pool to allocate the
+    memory, so that we don't lose memory. */
+ 
+ static char *
+ pool_strdup(char * string)
+ {
+     char *   p;
+ 
+     if (string == NULL)
+       return NULL;
+ 
+     p = mp_malloc(poolname, strlen(string) + 1);
+     if (p == NULL)
+       return NULL;
+ 
+     strcpy(p, string);
+     return p;
+ }
+ 
+ /* Allocate a new buffer (using the memory pool) and join the strings
+    'a' and 'b' into it. */
+ 
+ static char *
+ pool_strjoin(char * a, char * b)
+ {
+     char *   p;
+     int      length = 0;
+ 
+     if (a != NULL)
+       length += strlen(a);
+     if (b != NULL)
+       length += strlen(b);
+     if (length == 0)
+       return NULL;
+ 
+     p = mp_malloc(poolname, length + 2);
+     if (p == NULL)
+       return NULL;
+     else
+       *p = '\0';
+ 
+     if (a)
+       strcpy(p, a);
+     if (b)
+       strcpy(&(p[strlen(p)]), b);
+ 
+     return p;
+ }
+ 
+ /****** public routines ******/
+ 
+ #include "parse_address.c"

CVSTrac 2.0.1