/* read a number from 0 to 7, for bit, set or res */ static int rd_0_7 (const char **p) { *p = delspc (*p); if (**p == 0) return 0; bitsetres = *p; skipword (p, ','); return 1; }
/* read a word from input and store it in readword. return 1 on success */ static int rd_word (const char **p, char delimiter) { *p = delspc (*p); if (**p == 0) return 0; readword = *p; mem_delimiter = delimiter; skipword (p, delimiter); return 1; }
/* read a byte from input and store it in readbyte. return 1 on success */ static int rd_byte (const char **p, char delimiter) { *p = delspc (*p); if (**p == 0) return 0; readbyte = *p; writebyte = 1; mem_delimiter = delimiter; skipword (p, delimiter); return 1; }
void getnamelink(char *l, char **name, char **link) { /* "page NAME title-or-link" splitup */ char *p; dbgprintf("getnamelink(%s, ...)\n", textornull(l)); *name = null_text; *link = null_text; /* Skip page/subpage keyword, and whitespace after that */ p = skipwhitespace(skipword(l)); *name = p; p = skipword(p); if (*p) { *p = '\0'; /* Null-terminate pagename */ p++; *link = skipwhitespace(p); } }
void getgrouptitle(char *l, char *pageset, char **title, char **onlycols, char **exceptcols) { char grouponlytag[100], groupexcepttag[100], grouptag[100]; *title = null_text; *onlycols = NULL; *exceptcols = NULL; sprintf(grouponlytag, "%sgroup-only", pageset); sprintf(groupexcepttag, "%sgroup-except", pageset); sprintf(grouptag, "%sgroup", pageset); dbgprintf("getgrouptitle(%s, ...)\n", textornull(l)); if (strncmp(l, grouponlytag, strlen(grouponlytag)) == 0) { char *p; *onlycols = skipwhitespace(skipword(l)); p = skipword(*onlycols); if (*p) { *p = '\0'; p++; *title = skipwhitespace(p); } } else if (strncmp(l, groupexcepttag, strlen(groupexcepttag)) == 0) { char *p; *exceptcols = skipwhitespace(skipword(l)); p = skipword(*exceptcols); if (*p) { *p = '\0'; p++; *title = skipwhitespace(p); } } else if (strncmp(l, grouptag, strlen(grouptag)) == 0) { *title = skipwhitespace(skipword(l)); } }
void AddDisks(VM& vm) { char* pCommandLine = GetCommandLine(); char *p = skipword(pCommandLine); p = skipspaces(p); while (p != null && *p != 0) { char* q = skipword(p); if (q != null && *q != 0) { *q = 0; q++; } if (*p == '"') p++; if (strlen(p) > 0 && p[strlen(p)-1] == '"') p[strlen(p)-1] = 0; if (strlen(p) > 0) { if (!vm.Disks.AddDisk(p)) vm.printf("failed to add disk \"%s\"\n", p); else vm.printf("disk%d \"%s\"\n", vm.Disks.GetCount()-1, p); } if (q != null && *q != 0) p = skipspaces(q); else p = null; } }
uint8_t LanguageIdentifier::guessCountryFromUserAgent(char *ua) { if(!ua) return(0); uint8_t country = 0; while(*ua) { if(!(ua = skipwhite(ua))) return(0); if(s_isLangTag(ua) && (country = s_getCountryFromSpec(ua)) != 0) return(country); if(!(ua = skipword(ua))) return(0); } return(0); }
uint8_t LanguageIdentifier::guessLanguageFromUserAgent(char *str) { // Mozilla/5.0 (X11; U; Linux i686; // en-US; rv:1.8.1.4) Gecko/20070531 Firefox/2.0.0.4 uint8_t lang = langUnknown; while(*str) { if(!(str = skipwhite(str))) return(langUnknown); if((lang = getLanguageFromUserAgent(str)) != langUnknown) return(lang); if(!(str = skipword(str))) return(langUnknown); } return(langUnknown); }
int countwords(char *buf, int bufsize) { int count; char *p; count=0; for(p=buf;;) { if(!(p=skipwhitespace(p,buf,bufsize))) break; count++; if(!(p=skipword(p,buf,bufsize))) break; } return count; }
void getparentnamelink(char *l, xymongen_page_t *toppage, xymongen_page_t **parent, char **name, char **link) { /* "subparent NAME PARENTNAME title-or-link" splitup */ char *p; char *parentname; xymonpagelist_t *walk; dbgprintf("getnamelink(%s, ...)\n", textornull(l)); *name = null_text; *link = null_text; /* Skip page/subpage keyword, and whitespace after that */ parentname = p = skipwhitespace(skipword(l)); p = skipword(p); if (*p) { *p = '\0'; /* Null-terminate pagename */ p++; *name = p = skipwhitespace(p); p = skipword(p); if (*p) { *p = '\0'; /* Null-terminate parentname */ p++; *link = skipwhitespace(p); } } for (walk = pagelisthead; (walk && (strcmp(walk->pageentry->name, parentname) != 0)); walk = walk->next) ; if (walk) { *parent = walk->pageentry; } else { errprintf("Cannot find parent page '%s'\n", parentname); *parent = NULL; } }
size_t TFormatOutput::FormLine(const char *str, size_t pos, Stroka &Line) { Line = ""; size_t len = strlen(str); for(size_t i = 0; i < Level; i++) Line += Ident; int NextLine; size_t pos1 = pos; while(1) { pos1 = skipspace(str, pos1, len, NextLine, Line); if(NextLine || Line.size() >= MaxLen || pos1 >= len) return pos1; pos1 = skipword(str, pos1, len, NextLine, Line); if(NextLine || Line.size() >= MaxLen || pos1 >= len) return pos1; } }
char * get_nth_word (const char *str, int n) { char buf[4096] = {0}; char *start = NULL; char *word = NULL; int i = 0; int word_len = 0; const char *end = NULL; if (!str) goto out; snprintf (buf, sizeof (buf), "%s", str); start = buf; for (i = 0; i < n-1; i++) skipword (&start); skipwhite (&start); end = strpbrk ((const char *)start, " \t\n\0"); if (!end) goto out; word_len = abs (end - start); word = GF_CALLOC (1, word_len + 1, gf_common_mt_strdup); if (!word) goto out; strncpy (word, start, word_len); *(word + word_len) = '\0'; out: return word; }
static char *parse_histlogfile(char *hostname, char *servicename, char *timespec) { char cause[MAX_LINE_LEN]; char fn[PATH_MAX]; char *p; FILE *fd; char l[MAX_LINE_LEN]; int causefull = 0; cause[0] = '\0'; sprintf(fn, "%s/%s", xgetenv("XYMONHISTLOGS"), commafy(hostname)); for (p = strrchr(fn, '/'); (*p); p++) if (*p == ',') *p = '_'; sprintf(p, "/%s/%s", servicename, timespec); dbgprintf("Looking at history logfile %s\n", fn); fd = fopen(fn, "r"); if (fd != NULL) { while (!causefull && fgets(l, sizeof(l), fd)) { p = strchr(l, '\n'); if (p) *p = '\0'; if ((l[0] == '&') && (strncmp(l, "&green", 6) != 0)) { p = skipwhitespace(skipword(l)); if ((strlen(cause) + strlen(p) + strlen("<BR>\n") + 1) < sizeof(cause)) { strcat(cause, p); strcat(cause, "<BR>\n"); } else causefull = 1; } } #if 1 if (strlen(cause) == 0) { strcpy(cause, "See detailed log"); } #else /* What is this code supposed to do ? The sscanf seemingly never succeeds */ /* storner, 2006-06-02 */ if (strlen(cause) == 0) { int offset; rewind(fd); if (fgets(l, sizeof(l), fd)) { p = strchr(l, '\n'); if (p) *p = '\0'; if (sscanf(l, "%*s %*s %*s %*s %*s %*s %*s %n", &offset) == 1) { strncpy(cause, l+offset, sizeof(cause)); } else { errprintf("Scan of file %s failed, l='%s'\n", fn, l); } cause[sizeof(cause)-1] = '\0'; } } #endif if (causefull) { cause[sizeof(cause) - strlen(" [Truncated]") - 1] = '\0'; strcat(cause, " [Truncated]"); } fclose(fd); } else { strcpy(cause, "No historical status available"); } return strdup(cause); }
xymongen_page_t *load_layout(char *pgset) { char pagetag[100], subpagetag[100], subparenttag[100], vpagetag[100], vsubpagetag[100], vsubparenttag[100], grouptag[100], summarytag[100], titletag[100], hosttag[100]; char *name, *link, *onlycols, *exceptcols; char hostname[MAX_LINE_LEN]; xymongen_page_t *toppage, *curpage, *cursubpage, *cursubparent; group_t *curgroup; host_t *curhost; char *curtitle; int ip1, ip2, ip3, ip4; char *p; int fqdn = get_fqdn(); char *cfgdata, *inbol, *ineol, insavchar = '\0'; if (loadhostsfromxymond) { if (load_hostnames("@", NULL, fqdn) != 0) { errprintf("Cannot load host configuration from xymond\n"); return NULL; } } else { if (load_hostnames(xgetenv("HOSTSCFG"), "dispinclude", fqdn) != 0) { errprintf("Cannot load host configuration from %s\n", xgetenv("HOSTSCFG")); return NULL; } } if (first_host() == NULL) { errprintf("Empty configuration from %s\n", (loadhostsfromxymond ? "xymond" : xgetenv("HOSTSCFG"))); return NULL; } dbgprintf("load_layout(pgset=%s)\n", textornull(pgset)); /* * load_hostnames() picks up the hostname definitions, but not the page * layout. So we will scan the file again, this time doing the layout. */ if (pgset == NULL) pgset = ""; sprintf(pagetag, "%spage", pgset); sprintf(subpagetag, "%ssubpage", pgset); sprintf(subparenttag, "%ssubparent", pgset); sprintf(vpagetag, "v%spage", pgset); sprintf(vsubpagetag, "v%ssubpage", pgset); sprintf(vsubparenttag, "v%ssubparent", pgset); sprintf(grouptag, "%sgroup", pgset); sprintf(summarytag, "%ssummary", pgset); sprintf(titletag, "%stitle", pgset); sprintf(hosttag, "%s:", pgset); for (p=hosttag; (*p); p++) *p = toupper((int)*p); toppage = init_page("", "", 0); addtopagelist(toppage); curpage = NULL; cursubpage = NULL; curgroup = NULL; curhost = NULL; cursubparent = NULL; curtitle = NULL; inbol = cfgdata = hostscfg_content(); while (inbol && *inbol) { inbol += strspn(inbol, " \t"); ineol = strchr(inbol, '\n'); if (ineol) { while ((ineol > inbol) && (isspace(*ineol) || (*ineol == '\n'))) ineol--; if (*ineol != '\n') ineol++; insavchar = *ineol; *ineol = '\0'; } dbgprintf("load_layout: -- got line '%s'\n", inbol); if ((strncmp(inbol, pagetag, strlen(pagetag)) == 0) || (strncmp(inbol, vpagetag, strlen(vpagetag)) == 0)) { getnamelink(inbol, &name, &link); if (curpage == NULL) { /* First page - hook it on toppage as a subpage from there */ curpage = toppage->subpages = init_page(name, link, (strncmp(inbol, vpagetag, strlen(vpagetag)) == 0)); } else { curpage = curpage->next = init_page(name, link, (strncmp(inbol, vpagetag, strlen(vpagetag)) == 0)); } curpage->parent = toppage; if (curtitle) { curpage->pretitle = curtitle; curtitle = NULL; } cursubpage = NULL; cursubparent = NULL; curgroup = NULL; curhost = NULL; addtopagelist(curpage); } else if ( (strncmp(inbol, subpagetag, strlen(subpagetag)) == 0) || (strncmp(inbol, vsubpagetag, strlen(vsubpagetag)) == 0) ) { if (curpage == NULL) { errprintf("'subpage' ignored, no preceding 'page' tag : %s\n", inbol); goto nextline; } getnamelink(inbol, &name, &link); if (cursubpage == NULL) { cursubpage = curpage->subpages = init_page(name, link, (strncmp(inbol, vsubpagetag, strlen(vsubpagetag)) == 0)); } else { cursubpage = cursubpage->next = init_page(name, link, (strncmp(inbol, vsubpagetag, strlen(vsubpagetag)) == 0)); } cursubpage->parent = curpage; if (curtitle) { cursubpage->pretitle = curtitle; curtitle = NULL; } cursubparent = NULL; curgroup = NULL; curhost = NULL; addtopagelist(cursubpage); } else if ( (strncmp(inbol, subparenttag, strlen(subparenttag)) == 0) || (strncmp(inbol, vsubparenttag, strlen(vsubparenttag)) == 0) ) { xymongen_page_t *parentpage, *walk; getparentnamelink(inbol, toppage, &parentpage, &name, &link); if (parentpage == NULL) { errprintf("'subparent' ignored, unknown parent page: %s\n", inbol); goto nextline; } cursubparent = init_page(name, link, (strncmp(inbol, vsubparenttag, strlen(vsubparenttag)) == 0)); if (parentpage->subpages == NULL) { parentpage->subpages = cursubparent; } else { for (walk = parentpage->subpages; (walk->next); (walk = walk->next)) ; walk->next = cursubparent; } if (curtitle) { cursubparent->pretitle = curtitle; curtitle = NULL; } cursubparent->parent = parentpage; curgroup = NULL; curhost = NULL; addtopagelist(cursubparent); } else if (strncmp(inbol, grouptag, strlen(grouptag)) == 0) { int sorthosts = (strstr(inbol, "group-sorted") != NULL); getgrouptitle(inbol, pgset, &link, &onlycols, &exceptcols); if (curgroup == NULL) { curgroup = init_group(link, onlycols, exceptcols, sorthosts); if (cursubparent != NULL) { cursubparent->groups = curgroup; } else if (cursubpage != NULL) { /* We're in a subpage */ cursubpage->groups = curgroup; } else if (curpage != NULL) { /* We're on a main page */ curpage->groups = curgroup; } else { /* We're on the top page */ toppage->groups = curgroup; } } else { curgroup->next = init_group(link, onlycols, exceptcols, sorthosts); curgroup = curgroup->next; } if (curtitle) { curgroup->pretitle = curtitle; curtitle = NULL; } curhost = NULL; } else if (sscanf(inbol, "%3d.%3d.%3d.%3d %s", &ip1, &ip2, &ip3, &ip4, hostname) == 5) { void *xymonhost = NULL; int dialup, nonongreen, crittime = 1; double warnpct = reportwarnlevel; int warnstops = reportwarnstops; char *displayname, *clientalias, *comment, *description; char *alertlist, *onwaplist, *reporttime; char *nopropyellowlist, *nopropredlist, *noproppurplelist, *nopropacklist; char *targetpagelist[MAX_TARGETPAGES_PER_HOST]; int targetpagecount; char *hval; /* Check for ".default." hosts - they are ignored. */ if (*hostname == '.') goto nextline; if (!fqdn) { /* Strip any domain from the hostname */ char *p = strchr(hostname, '.'); if (p) *p = '\0'; } /* Get the info */ xymonhost = hostinfo(hostname); if (xymonhost == NULL) { errprintf("Confused - hostname '%s' cannot be found. Ignored\n", hostname); goto nextline; } /* Check for no-display hosts - they are ignored. */ /* But only when we're building the default pageset */ if ((strlen(pgset) == 0) && (xmh_item(xymonhost, XMH_FLAG_NODISP) != NULL)) goto nextline; for (targetpagecount=0; (targetpagecount < MAX_TARGETPAGES_PER_HOST); targetpagecount++) targetpagelist[targetpagecount] = NULL; targetpagecount = 0; dialup = (xmh_item(xymonhost, XMH_FLAG_DIALUP) != NULL); nonongreen = (xmh_item(xymonhost, XMH_FLAG_NONONGREEN) != NULL); alertlist = xmh_item(xymonhost, XMH_NK); hval = xmh_item(xymonhost, XMH_NKTIME); if (hval) crittime = within_sla(xmh_item(xymonhost, XMH_HOLIDAYS), hval, 0); onwaplist = xmh_item(xymonhost, XMH_WML); nopropyellowlist = xmh_item(xymonhost, XMH_NOPROPYELLOW); if (nopropyellowlist == NULL) nopropyellowlist = xmh_item(xymonhost, XMH_NOPROP); nopropredlist = xmh_item(xymonhost, XMH_NOPROPRED); noproppurplelist = xmh_item(xymonhost, XMH_NOPROPPURPLE); nopropacklist = xmh_item(xymonhost, XMH_NOPROPACK); displayname = xmh_item(xymonhost, XMH_DISPLAYNAME); comment = xmh_item(xymonhost, XMH_COMMENT); description = xmh_item(xymonhost, XMH_DESCRIPTION); hval = xmh_item(xymonhost, XMH_WARNPCT); if (hval) warnpct = atof(hval); hval = xmh_item(xymonhost, XMH_WARNSTOPS); if (hval) warnstops = atof(hval); reporttime = xmh_item(xymonhost, XMH_REPORTTIME); clientalias = xmh_item(xymonhost, XMH_CLIENTALIAS); if (xymonhost && (strcmp(xmh_item(xymonhost, XMH_HOSTNAME), clientalias) == 0)) clientalias = NULL; if (xymonhost && (strlen(pgset) > 0)) { /* Walk the clone-list and pick up the target pages for this host */ void *cwalk = xymonhost; do { hval = xmh_item_walk(cwalk); while (hval) { if (strncasecmp(hval, hosttag, strlen(hosttag)) == 0) targetpagelist[targetpagecount++] = strdup(hval+strlen(hosttag)); hval = xmh_item_walk(NULL); } cwalk = next_host(cwalk, 1); } while (cwalk && (strcmp(xmh_item(cwalk, XMH_HOSTNAME), xmh_item(xymonhost, XMH_HOSTNAME)) == 0) && (targetpagecount < MAX_TARGETPAGES_PER_HOST) ); /* * HACK: Check if the pageset tag is present at all in the host * entry. If it isn't, then drop this incarnation of the host. * * Without this, the following hosts.cfg file will have the * www.hswn.dk host listed twice on the alternate pageset: * * adminpage nyc NYC * * 127.0.0.1 localhost # bbd http://localhost/ CLIENT:osiris * 172.16.10.2 www.xymon.com # http://www.xymon.com/ ADMIN:nyc ssh noinfo * * page superdome Superdome * 172.16.10.2 www.xymon.com # noconn * */ if (strstr(inbol, hosttag) == NULL) targetpagecount = 0; } if (strlen(pgset) == 0) { /* * Default pageset generated. Put the host into * whatever group or page is current. */ if (curhost == NULL) { curhost = init_host(hostname, 0, displayname, clientalias, comment, description, ip1, ip2, ip3, ip4, dialup, warnpct, warnstops, reporttime, alertlist, crittime, onwaplist, nopropyellowlist, nopropredlist, noproppurplelist, nopropacklist); if (curgroup != NULL) { curgroup->hosts = curhost; } else if (cursubparent != NULL) { cursubparent->hosts = curhost; } else if (cursubpage != NULL) { cursubpage->hosts = curhost; } else if (curpage != NULL) { curpage->hosts = curhost; } else { toppage->hosts = curhost; } } else { curhost = curhost->next = init_host(hostname, 0, displayname, clientalias, comment, description, ip1, ip2, ip3, ip4, dialup, warnpct, warnstops, reporttime, alertlist, crittime, onwaplist, nopropyellowlist,nopropredlist, noproppurplelist, nopropacklist); } curhost->parent = (cursubparent ? cursubparent : (cursubpage ? cursubpage : curpage)); if (curtitle) { curhost->pretitle = curtitle; curtitle = NULL; } curhost->nonongreen = nonongreen; } else if (targetpagecount) { int pgnum; for (pgnum=0; (pgnum < targetpagecount); pgnum++) { char *targetpagename = targetpagelist[pgnum]; char savechar; int wantedgroup = 0; xymonpagelist_t *targetpage = NULL; /* Put the host into the page specified by the PGSET: tag */ p = strchr(targetpagename, ','); if (p) { savechar = *p; *p = '\0'; wantedgroup = atoi(p+1); } else { savechar = '\0'; p = targetpagename + strlen(targetpagename); } /* Find the page */ if (strcmp(targetpagename, "*") == 0) { *targetpagename = '\0'; } for (targetpage = pagelisthead; (targetpage && (strcmp(targetpagename, targetpage->pageentry->name) != 0)); targetpage = targetpage->next) ; *p = savechar; if (targetpage == NULL) { errprintf("Warning: Cannot find any target page named '%s' in set '%s' - dropping host '%s'\n", targetpagename, pgset, hostname); } else { host_t *newhost = init_host(hostname, 0, displayname, clientalias, comment, description, ip1, ip2, ip3, ip4, dialup, warnpct, warnstops, reporttime, alertlist, crittime, onwaplist, nopropyellowlist,nopropredlist, noproppurplelist, nopropacklist); if (wantedgroup > 0) { group_t *gwalk; host_t *hwalk; int i; for (gwalk = targetpage->pageentry->groups, i=1; (gwalk && (i < wantedgroup)); i++,gwalk=gwalk->next) ; if (gwalk) { if (gwalk->hosts == NULL) gwalk->hosts = newhost; else { for (hwalk = gwalk->hosts; (hwalk->next); hwalk = hwalk->next) ; hwalk->next = newhost; } } else { errprintf("Warning: Cannot find group %d for host %s - dropping host\n", wantedgroup, hostname); } } else { /* Just put in on the page's hostlist */ host_t *walk; if (targetpage->pageentry->hosts == NULL) targetpage->pageentry->hosts = newhost; else { for (walk = targetpage->pageentry->hosts; (walk->next); walk = walk->next) ; walk->next = newhost; } } newhost->parent = targetpage->pageentry; if (curtitle) newhost->pretitle = curtitle; } curtitle = NULL; } } } else if (strncmp(inbol, summarytag, strlen(summarytag)) == 0) { /* summary row.column IP-ADDRESS-OF-PARENT http://xymon.com/ */ char sumname[MAX_LINE_LEN]; char receiver[MAX_LINE_LEN]; char url[MAX_LINE_LEN]; summary_t *newsum; if (sscanf(inbol, "summary %s %s %s", sumname, receiver, url) == 3) { newsum = init_summary(sumname, receiver, url); newsum->next = sumhead; sumhead = newsum; } } else if (strncmp(inbol, titletag, strlen(titletag)) == 0) { /* Save the title for the next entry */ curtitle = strdup(skipwhitespace(skipword(inbol))); } nextline: if (ineol) { *ineol = insavchar; if (*ineol != '\n') ineol = strchr(ineol, '\n'); inbol = (ineol ? ineol+1 : NULL); } else inbol = NULL; } xfree(cfgdata); return toppage; }
host_t *init_host(char *hostname, int issummary, char *displayname, char *clientalias, char *comment, char *description, int ip1, int ip2, int ip3, int ip4, int dialup, double warnpct, int warnstops, char *reporttime, char *alerts, int crittime, char *waps, char *nopropyellowtests, char *nopropredtests, char *noproppurpletests, char *nopropacktests) { host_t *newhost = (host_t *) calloc(1, sizeof(host_t)); hostlist_t *oldlist; hostcount++; dbgprintf("init_host(%s)\n", textornull(hostname)); newhost->hostname = newhost->displayname = strdup(hostname); if (displayname) newhost->displayname = strdup(displayname); newhost->clientalias = (clientalias ? strdup(clientalias) : NULL); newhost->comment = (comment ? strdup(comment) : NULL); newhost->description = (description ? strdup(description) : NULL); sprintf(newhost->ip, "%d.%d.%d.%d", ip1, ip2, ip3, ip4); newhost->pretitle = NULL; newhost->entries = NULL; newhost->color = -1; newhost->oldage = 1; newhost->dialup = dialup; newhost->reportwarnlevel = warnpct; newhost->reportwarnstops = warnstops; newhost->reporttime = (reporttime ? strdup(reporttime) : NULL); if (alerts && crittime) { newhost->alerts = strdup(alerts); } else { newhost->alerts = NULL; } newhost->anywaps = 0; newhost->wapcolor = -1; /* Wap set is : * - Specific WML: tag * - NK: tag * - --wap=COLUMN cmdline option * - NULL */ if (waps || alerts) { newhost->waps = strdup(waps ? waps : alerts); } else { newhost->waps = wapcolumns; } if (nopropyellowtests) { char *p; p = skipword(nopropyellowtests); if (*p) *p = '\0'; else p = NULL; newhost->nopropyellowtests = strdup(build_noprop(nopropyellowdefault, nopropyellowtests)); if (p) *p = ' '; } else { newhost->nopropyellowtests = nopropyellowdefault; } if (nopropredtests) { char *p; p = skipword(nopropredtests); if (*p) *p = '\0'; else p = NULL; newhost->nopropredtests = strdup(build_noprop(nopropreddefault, nopropredtests)); if (p) *p = ' '; } else { newhost->nopropredtests = nopropreddefault; } if (noproppurpletests) { char *p; p = skipword(noproppurpletests); if (*p) *p = '\0'; else p = NULL; newhost->noproppurpletests = strdup(build_noprop(noproppurpledefault, noproppurpletests)); if (p) *p = ' '; } else { newhost->noproppurpletests = noproppurpledefault; } if (nopropacktests) { char *p; p = skipword(nopropacktests); if (*p) *p = '\0'; else p = NULL; newhost->nopropacktests = strdup(build_noprop(nopropackdefault, nopropacktests)); if (p) *p = ' '; } else { newhost->nopropacktests = nopropackdefault; } newhost->parent = NULL; newhost->nonongreen = 0; newhost->next = NULL; /* Summary hosts don't go into the host list */ if (issummary) return newhost; /* * Add this host to the hostlist_t list of known hosts. * HOWEVER: It might be a duplicate! In that case, we need * to figure out which host record we want to use. */ oldlist = find_hostlist(hostname); if (oldlist == NULL) { hostlist_t *newlist; newlist = (hostlist_t *) calloc(1, sizeof(hostlist_t)); newlist->hostentry = newhost; newlist->clones = NULL; add_to_hostlist(newlist); } else { hostlist_t *clone = (hostlist_t *) calloc(1, sizeof(hostlist_t)); dbgprintf("Duplicate host definition for host '%s'\n", hostname); clone->hostentry = newhost; clone->clones = oldlist->clones; oldlist->clones = clone; } return newhost; }
/* do the actual work */ static int assemble (const char *str, unsigned char *_obuf) { int ifcount = 0, noifcount = 0; const char *ptr; char *bufptr; int r, s; /* registers */ obuflen = 0; obuf = _obuf; /* continue assembling until the last input file is done */ //for (file = 0; file < infilecount; ++file) do { int cmd, cont = 1; // XXX: must free z80buffer = strdup (str); if (!cont) break; /* break to next source file */ // if (havelist) // fprintf (listfile, "%04x", addr); for (bufptr = z80buffer; (bufptr = strchr (bufptr, '\n'));) *bufptr = ' '; for (bufptr = z80buffer; (bufptr = strchr (bufptr, '\r'));) *bufptr = ' '; ptr = z80buffer; //lastlabel = NULL; baseaddr = addr; ++stack[sp].line; ptr = delspc (ptr); if (!*ptr) continue; if (!noifcount && !define_macro) readlabel (&ptr, 1); else readlabel (&ptr, 0); ptr = delspc (ptr); if (!*ptr) continue; comma = 0; indexed = 0; indexjmp = 0; writebyte = 0; readbyte = 0; readword = 0; cmd = readcommand (&ptr) - 1; int i, have_quote; switch (cmd) { case Z80_ADC: if (!(r = rd_a_hl (&ptr))) break; if (r == HL) { if (!(r = rd_rr_ (&ptr))) break; wrtb (0xED); wrtb (0x4A + 0x10 * --r); break; } if (!(r = rd_r (&ptr))) break; wrtb (0x88 + --r); break; case Z80_ADD: if (!(r = rd_r_add (&ptr))) break; if (r == addHL) { if (!(r = rd_rrxx (&ptr))) break; wrtb (0x09 + 0x10 * --r); /* ADD HL/IX/IY, qq */ break; } if (has_argument (&ptr)) { if (r != A) { eprintf ("parse error before: %s\n", ptr); break; } if (!(r = rd_r (&ptr))) break; wrtb (0x80 + --r); /* ADD A,r */ break; } wrtb (0x80 + --r); /* ADD r */ break; case Z80_AND: if (!(r = rd_r (&ptr))) break; wrtb (0xA0 + --r); break; case Z80_BIT: if (!rd_0_7 (&ptr)) break; rd_comma (&ptr); if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x40 + (r - 1)); break; case Z80_CALL: if ((r = rd_cc (&ptr))) { wrtb (0xC4 + 8 * --r); rd_comma (&ptr); } else wrtb (0xCD); break; case Z80_CCF: wrtb (0x3F); break; case Z80_CP: if (!(r = rd_r (&ptr))) break; wrtb (0xB8 + --r); break; case Z80_CPD: wrtb (0xED); wrtb (0xA9); break; case Z80_CPDR: wrtb (0xED); wrtb (0xB9); break; case Z80_CPI: wrtb (0xED); wrtb (0xA1); break; case Z80_CPIR: wrtb (0xED); wrtb (0xB1); break; case Z80_CPL: wrtb (0x2F); break; case Z80_DAA: wrtb (0x27); break; case Z80_DEC: if (!(r = rd_r_rr (&ptr))) break; if (r < 0) { wrtb (0x05 - 8 * ++r); break; } wrtb (0x0B + 0x10 * --r); break; case Z80_DI: wrtb (0xF3); break; case Z80_DJNZ: wrtb (0x10); //rd_wrt_jr (&ptr, '\0'); break; case Z80_EI: wrtb (0xFB); break; case Z80_EX: if (!(r = rd_ex1 (&ptr))) break; switch (r) { case DE: if (!rd_hl (&ptr)) break; wrtb (0xEB); break; case AF: if (!rd_af_ (&ptr)) break; wrtb (0x08); break; default: if (!rd_hlx (&ptr)) break; wrtb (0xE3); } break; case Z80_EXX: wrtb (0xD9); break; case Z80_HALT: wrtb (0x76); break; case Z80_IM: if (!(r = rd_0_2 (&ptr))) break; wrtb (0xED); wrtb (0x46 + 8 * --r); break; case Z80_IN: if (!(r = rd_in (&ptr))) break; if (r == A) { if (!(r = rd_nnc (&ptr))) break; if (r == C) { wrtb (0xED); wrtb (0x40 + 8 * (A - 1)); break; } wrtb (0xDB); break; } if (!rd_c (&ptr)) break; wrtb (0xED); wrtb (0x40 + 8 * --r); break; case Z80_INC: if (!(r = rd_r_rr (&ptr))) break; if (r < 0) { wrtb (0x04 - 8 * ++r); break; } wrtb (0x03 + 0x10 * --r); break; case Z80_IND: wrtb (0xED); wrtb (0xAA); break; case Z80_INDR: wrtb (0xED); wrtb (0xBA); break; case Z80_INI: wrtb (0xED); wrtb (0xA2); break; case Z80_INIR: wrtb (0xED); wrtb (0xB2); break; case Z80_JP: r = rd_jp (&ptr); if (r < 0) { wrtb (0xE9); break; } if (r) { wrtb (0xC2 + 8 * --r); rd_comma (&ptr); } else wrtb (0xC3); break; case Z80_JR: r = rd_jr (&ptr); if (r) rd_comma (&ptr); wrtb (0x18 + 8 * r); break; case Z80_LD: if (!(r = rd_ld (&ptr))) break; switch (r) { case ld_BC: case ld_DE: if (!rd_a (&ptr)) break; wrtb (0x02 + 0x10 * (r == ld_DE)); break; case ld_HL: r = rd_ld_hl (&ptr); wrtb (0x70 + --r); break; case ld_NN: if (!(r = rd_ld_nn (&ptr))) break; if (r == ld_nnA || r == ld_nnHL) { wrtb (0x22 + 0x10 * (r == ld_nnA)); break; } wrtb (0xED); wrtb (0x43 + 0x10 * --r); break; case ldA: if (!(r = rd_lda (&ptr))) break; if (r == A_NN) { wrtb (0x3A); break; } if (r == A_I || r == A_R) { wrtb (0xED); wrtb (0x57 + 8 * (r == A_R)); break; } if (r < 0) { wrtb (0x0A - 0x10 * ++r); break; } wrtb (0x78 + --r); break; case ldB: case ldC: case ldD: case ldE: case ldH: case ldL: if (!(s = rd_ldbcdehla (&ptr))) break; wrtb (0x40 + 0x08 * (r - 7) + (s - 1)); break; case ldBC: case ldDE: s = rd_nn_nn (&ptr); if (s == _NN) { wrtb (0xED); wrtb (0x4B + 0x10 * (r == ldDE)); break; } wrtb (0x01 + (r == ldDE) * 0x10); break; case ldHL: r = rd_nn_nn (&ptr); wrtb (0x21 + (r == _NN) * 9); break; case ldI: case ldR: if (!rd_a (&ptr)) break; wrtb (0xED); wrtb (0x47 + 0x08 * (r == ldR)); break; case ldSP: r = rd_sp (&ptr); if (r == SPHL) { wrtb (0xF9); break; } if (r == SPNN) { wrtb (0x31); break; } wrtb (0xED); wrtb (0x7B); break; } break; case Z80_LDD: wrtb (0xED); wrtb (0xA8); break; case Z80_LDDR: wrtb (0xED); wrtb (0xB8); break; case Z80_LDI: wrtb (0xED); wrtb (0xA0); break; case Z80_LDIR: wrtb (0xED); wrtb (0xB0); break; case Z80_NEG: wrtb (0xED); wrtb (0x44); break; case Z80_NOP: wrtb (0x00); break; case Z80_OR: if (!(r = rd_r (&ptr))) break; wrtb (0xB0 + --r); break; case Z80_OTDR: wrtb (0xED); wrtb (0xBB); break; case Z80_OTIR: wrtb (0xED); wrtb (0xB3); break; case Z80_OUT: if (!(r = rd_nnc (&ptr))) break; if (r == C) { if (!(r = rd_out (&ptr))) break; wrtb (0xED); wrtb (0x41 + 8 * --r); break; } if (!rd_a (&ptr)) break; wrtb (0xD3); break; case Z80_OUTD: wrtb (0xED); wrtb (0xAB); break; case Z80_OUTI: wrtb (0xED); wrtb (0xA3); break; case Z80_POP: if (!(r = rd_stack (&ptr))) break; wrtb (0xC1 + 0x10 * --r); break; case Z80_PUSH: if (!(r = rd_stack (&ptr))) break; wrtb (0xC5 + 0x10 * --r); break; case Z80_RES: if (!rd_0_7 (&ptr)) break; rd_comma (&ptr); if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x80 + --r); break; case Z80_RET: if (!(r = rd_cc (&ptr))) { wrtb (0xC9); break; } wrtb (0xC0 + 8 * --r); break; case Z80_RETI: wrtb (0xED); wrtb (0x4D); break; case Z80_RETN: wrtb (0xED); wrtb (0x45); break; case Z80_RL: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x10 + --r); break; case Z80_RLA: wrtb (0x17); break; case Z80_RLC: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x00 + --r); break; case Z80_RLCA: wrtb (0x07); break; case Z80_RLD: wrtb (0xED); wrtb (0x6F); break; case Z80_RR: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x18 + --r); break; case Z80_RRA: wrtb (0x1F); break; case Z80_RRC: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x08 + --r); break; case Z80_RRCA: wrtb (0x0F); break; case Z80_RRD: wrtb (0xED); wrtb (0x67); break; case Z80_RST: ptr = ""; break; case Z80_SBC: if (!(r = rd_a_hl (&ptr))) break; if (r == HL) { if (!(r = rd_rr_ (&ptr))) break; wrtb (0xED); wrtb (0x42 + 0x10 * --r); break; } if (!(r = rd_r (&ptr))) break; wrtb (0x98 + --r); break; case Z80_SCF: wrtb (0x37); break; case Z80_SET: if (!rd_0_7 (&ptr)) break; rd_comma (&ptr); if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0xC0 + --r); break; case Z80_SLA: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x20 + --r); break; case Z80_SLI: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x30 + --r); break; case Z80_SRA: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x28 + --r); break; case Z80_SRL: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x38 + --r); break; case Z80_SUB: if (!(r = rd_r (&ptr))) break; if (has_argument (&ptr)) {/* SUB A,r ? */ if (r != A) { eprintf ("parse error before: %s\n", ptr); break; } if (!(r = rd_r (&ptr))) break; } wrtb (0x90 + --r); break; case Z80_XOR: if (!(r = rd_r (&ptr))) break; wrtb (0xA8 + --r); break; case Z80_DEFB: case Z80_DB: case Z80_DEFM: case Z80_DM: ptr = delspc (ptr); while (1) { have_quote = (*ptr == '"' || *ptr == '\''); if (have_quote) { /* Read string. */ int quote = *ptr; ++ptr; while (*ptr != quote) { write_one_byte (rd_character (&ptr, NULL, 1), 0); if (*ptr == 0) { eprintf ("end of line in quoted string\n"); break; } } ++ptr; } else { /* Read expression. */ skipword (&ptr, ','); } ptr = delspc (ptr); if (*ptr == ',') { ++ptr; continue; } if (*ptr != 0) eprintf ("junk in byte definition: %s\n", ptr); break; } break; case Z80_DEFW: case Z80_DW: if (!(r = rd_word (&ptr, ','))) { eprintf ("No data for word definition\n"); break; } while (1) { ptr = delspc (ptr); if (*ptr != ',') break; ++ptr; if (!(r = rd_word (&ptr, ','))) eprintf ("Missing expression in defw\n"); } break; case Z80_DEFS: case Z80_DS: r = rd_expr (&ptr, ',', NULL, sp, 1); if (r < 0) { eprintf ("ds should have its first argument >=0" " (not -0x%x)\n", -r); break; } ptr = delspc (ptr); if (*ptr) { rd_comma (&ptr); readbyte = 0; rd_byte (&ptr, '\0'); writebyte = 0; break; } for (i = 0; i < r; i++) { write_one_byte (0, 0); } break; case Z80_END: break; case Z80_ORG: addr = rd_expr (&ptr, '\0', NULL, sp, 1) & 0xffff; break; case Z80_IF: if (rd_expr (&ptr, '\0', NULL, sp, 1)) ifcount++; else noifcount++; break; case Z80_ELSE: if (ifcount == 0) { eprintf ("else without if\n"); break; } noifcount = 1; ifcount--; break; case Z80_ENDIF: if (noifcount == 0 && ifcount == 0) { eprintf ("endif without if\n"); break; } if (noifcount) noifcount--; else ifcount--; break; case Z80_ENDM: if (stack[sp].file) eprintf ("endm outside macro definition\n"); break; case Z80_SEEK: eprintf ("seek error\n"); break; default: //eprintf ("command or comment expected (was %s)\n", ptr); return 0; } } while (0); //free (infile); return obuflen; }