Re: please verify the code
- From: Joe Wright <joewwright@xxxxxxxxxxx>
- Date: Thu, 22 Dec 2005 14:57:04 -0500
websnarf@xxxxxxxxx wrote:
Roman Mashak wrote:
I wrote function parsing the fully-quilified domain name and extracting 'host' and 'domain' parts seperately.
I am highly skeptical that the *functionality* of your code is correct. I usually take URLs to be of the form: (<subdomainname>.)*<host-domainname>.<top-level-domainname> where certain domain names have exceptional rules (co.uk, for example). Ripping off the top most part usually just gets your some sub-assignment by the host themselves.
[...] The important thing for me is to keep original string (pointed by 'fqdn' in function). Is my way of coding correct, is there a way to optimize function and make it not so clumsy (I like the code produced by K&R in their famous book: brief, clear, comprehensible, nothing superfluous :) ).
This newsgroup is poor place to come for "optimization" help, unless you mean making it somehow look like K&R-style syntax or something like that. But I happen to see your post so ...
First of all, why do you do the extra copying step through p? Its unnecessary! Presumably, you have two destination buffers ready to receive data, just do your final manipulations in there:
----------------------------------------
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stddef.h>
static int parse_fqdn(char *fqdn, char *host, char *domain) { char *s = strstr (fqdn, "."); ptrdiff_t len = s - fqdn;
if (NULL == s) return -1; memcpy (host, fqdn, len); host[len] = '\0'; strcpy (domain, s + 1); return 0; }
#define BUFLEN 1024
int main(void) { char dom[] = "www.my.example.dom.ain"; static char h[BUFLEN], d[BUFLEN];
if ( parse_fqdn(dom, h, d) == 0 ) printf("fqdn='%s'\nhostname='%s', domain name='%s'\n", dom, h, d); return EXIT_SUCCESS; }
----------------------------------------
Ok, notice how I moved the BUFLEN definition below the parse_fqdn definition? In this way you can make somewhat more enlightened decisions about the target buffer length in the future, if necessary. For example, in your main you could easily do this:
static char h[sizeof (dom)], d[sizeof (dom)];
and avoid the use of predefined fixed size buffers altogether. In more dynamic situations, you would malloc char*'s with the strlen() of the input strings or something to that effect.
Of course when you get tired of buffer overflows, performance problems, and other buffer management issues, you can just use "The Better String Library":
----------------------------------------
#include <stdlib.h> #include <stdio.h> #include "bstrlib.h"
int main(void) { struct tagbstring dom = bsStatic ("www.my.example.dom.ain"); int i = bstrchr (&dom, '.'); /* I think bstrrchr is what you really want here */ if (BSTR_ERR != i) { bstring h = blk2bstr (dom.data, i); bstring d = blk2bstr (dom.data + i + 1, dom.slen - (i + 1)); printf("fqdn='%s'\nhostname='%s', domain name='%s'\n", dom.data, bdatae (h, "<Out of memory>"), bdatae (d, "<Out of memory>")); bdestroy (h); bdestroy (d); } return EXIT_SUCCESS; }
----------------------------------------
Notice how there is no "#include <string.h>" here? As a good rule of thumb -- there is a good chance you are introducing performance problems if you have included that file.
Ok, I'll bite. How does "#include <string.h>" affect the performance of anything that doesn't use it?
--
Joe Wright
"Everything should be made as simple as possible, but not simpler."
--- Albert Einstein ---
.- Follow-Ups:
- Re: please verify the code
- From: websnarf
- Re: please verify the code
- From: Keith Thompson
- Re: please verify the code
- From: Default User
- Re: please verify the code
- References:
- please verify the code
- From: Roman Mashak
- Re: please verify the code
- From: websnarf
- please verify the code
- Prev by Date: Re: Macro substitutions
- Next by Date: Re: please verify the code
- Previous by thread: Re: please verify the code
- Next by thread: Re: please verify the code
- Index(es):
Relevant Pages
|