APREQ_DECLARE(int) apreq_cookie_serialize(const apreq_cookie_t *c, char *buf, apr_size_t len) { /* The format string must be large enough to accomodate all * of the cookie attributes. The current attributes sum to * ~90 characters (w/ 6-8 padding chars per attr), so anything * over 100 should be fine. */ unsigned version = apreq_cookie_version(c); char format[128] = "%s=%s"; char *f = format + strlen(format); /* XXX protocol enforcement (for debugging, anyway) ??? */ if (c->v.name == NULL) return -1; #define NULL2EMPTY(attr) (attr ? attr : "") if (version == NETSCAPE) { char expires[APR_RFC822_DATE_LEN] = {0}; #define ADD_NS_ATTR(name) do { \ if (c->name != NULL) \ strcpy(f, "; " #name "=%s"); \ else \ strcpy(f, "%0.s"); \ f += strlen(f); \ } while (0) ADD_NS_ATTR(path); ADD_NS_ATTR(domain); if (c->max_age != -1) { strcpy(f, "; expires=%s"); apr_rfc822_date(expires, c->max_age + apr_time_now()); expires[7] = '-'; expires[11] = '-'; } else strcpy(f, ""); f += strlen(f); if (apreq_cookie_is_secure(c)) strcpy(f, "; secure"); f += strlen(f); if (apreq_cookie_is_httponly(c)) strcpy(f, "; HttpOnly"); return apr_snprintf(buf, len, format, c->v.name, c->v.data, NULL2EMPTY(c->path), NULL2EMPTY(c->domain), expires); } /* c->version == RFC */ strcpy(f,"; Version=%u"); f += strlen(f); /* ensure RFC attributes are always quoted */ #define ADD_RFC_ATTR(name) do { \ if (c->name != NULL) \ if (*c->name == '"') \ strcpy(f, "; " #name "=%s"); \ else \ strcpy(f, "; " #name "=\"%s\""); \ else \ strcpy(f, "%0.s"); \ f += strlen (f); \ } while (0) ADD_RFC_ATTR(path); ADD_RFC_ATTR(domain); ADD_RFC_ATTR(port); ADD_RFC_ATTR(comment); ADD_RFC_ATTR(commentURL); strcpy(f, c->max_age != -1 ? "; max-age=%" APR_TIME_T_FMT : ""); f += strlen(f); if (apreq_cookie_is_secure(c)) strcpy(f, "; secure"); f += strlen(f); if (apreq_cookie_is_httponly(c)) strcpy(f, "; HttpOnly"); return apr_snprintf(buf, len, format, c->v.name, c->v.data, version, NULL2EMPTY(c->path), NULL2EMPTY(c->domain), NULL2EMPTY(c->port), NULL2EMPTY(c->comment), NULL2EMPTY(c->commentURL), apr_time_sec(c->max_age)); }
void PGNSaveToFile (const char *file, const char *resultstr) /**************************************************************************** * * To save a game into PGN format to a file. If the file does not exist, * it will create it. If the file exists, the game is appended to the file. * ****************************************************************************/ { FILE *fp; char s[100]; int len; char *p; int i; time_t secs; struct tm *timestruct; fp = fopen (file, "a"); /* Can we append to it? */ if (fp == NULL) { printf ("Cannot write to file %s\n", file); return; } /* Write the seven tags */ fprintf (fp, "[Event \"%s\"]\n", NULL2EMPTY(pgn_event)); fprintf (fp, "[Site \"%s\"]\n", NULL2EMPTY(pgn_site)); secs=time(0); if (pgn_date) fprintf(fp,"[Date \"%s\"]\n", pgn_date); else { timestruct=localtime((time_t*) &secs); fprintf(fp,"[Date \"%4d.%02d.%02d\"]\n",timestruct->tm_year+1900, timestruct->tm_mon+1,timestruct->tm_mday); } fprintf (fp, "[Round \"%s\"]\n", NULL2EMPTY(pgn_round)); if (pgn_white) fprintf (fp, "[White \"%s\"]\n", pgn_white); else if (computer == white) fprintf (fp, "[White \"%s %s\"]\n",PROGRAM,VERSION); else fprintf (fp, "[White \"%s\"]\n",name); if (pgn_black) fprintf (fp, "[Black \"%s\"]\n", pgn_black); else if (computer == black) fprintf (fp, "[Black \"%s %s\"]\n",PROGRAM,VERSION); else fprintf (fp, "[Black \"%s\"]\n",name); if (pgn_whiteELO) fprintf (fp, "[WhiteELO \"%s\"]\n", NULL2EMPTY(pgn_white)); else fprintf(fp, "[WhiteELO \"%d\"]\n",computer==white?myrating:opprating); if (pgn_blackELO) fprintf (fp, "[BlackELO \"%s\"]\n", NULL2EMPTY(pgn_black)); else fprintf (fp, "[BlackELO \"%d\"]\n",computer==white?opprating:myrating); if (pgn_result) fprintf (fp, "[Result \"%s\"]\n", pgn_result); else { /* Revive the little-known standard functions! */ len = strcspn(resultstr," {"); fprintf (fp, "[Result \"%.*s\"]\n", len, resultstr); } if (pgn_othertags) { fprintf (fp, "%s", pgn_othertags); } fprintf (fp, "\n"); if (initial_comments) { fprintf(fp, "\n%s\n", initial_comments); /* If it doesn't end in \n, add it */ if (initial_comments[0] && initial_comments[strlen(initial_comments)-1] != '\n') fprintf(fp, "\n"); } s[0] = '\0'; for (i = 0; i <= GameCnt; i++) { if (! (i % 2)) { sprintf (s, "%s%d. ", s, i/2 + 1); } sprintf (s, "%s%s ", s, Game[i].SANmv); if (strlen (s) > 80) { p = s + 79; while (*p-- != ' '); *++p = '\0'; fprintf (fp, "%s\n", s); strcpy (s, p+1); } if (Game[i].comments) { fprintf (fp, "%s\n", s); fprintf (fp, "%s", Game[i].comments); if (Game[i].comments[0] && Game[i].comments[strlen(Game[i].comments)-1] != '\n') fprintf(fp, "\n"); s[0] = '\0'; } } fprintf (fp, "%s", s); fprintf (fp, "%s", resultstr); fprintf (fp, "\n\n"); fclose (fp); }