static void show_lines(source_file *file, uint16_t line_min, uint16_t line_max) { char buf[LINE_BUF_SIZE]; int show_lineno = 1, found_newline = 0, is_printed = 0; if (file->fp == NULL) { return; } while (fgets(buf, sizeof(buf), file->fp) != NULL) { found_newline = remove_newlines(buf, file->fp); if (line_min <= file->lineno) { if (show_lineno) { printf("%-8d", file->lineno); } show_lineno = found_newline; printf(found_newline ? "%s\n" : "%s", buf); is_printed = 1; } if (found_newline) { if (line_max < ++file->lineno) { break; } } } if (is_printed && !found_newline) { printf("\n"); } }
void parse_scenario(FILE *input, struct scenario *scn) { int r; struct cmd c; char linebuf[LINE_LEN + 1]; char cmdbuf[LINE_LEN + 1]; scn->cmd_count = 0; while (scn->cmd_count < MAX_CMDS && !feof(input)) { c.cmd = CMD_NOOP; c.arg = 0; if (!fgets(linebuf, LINE_LEN, input)) { linebuf[0] = '\0'; } remove_newlines(linebuf); if (linebuf[0] != '#' && linebuf[0] != '\0') { r = sscanf(linebuf, "%s %d", cmdbuf, &c.arg); if (r != 2) c.cmd = CMD_SYNTAX_ERROR; else if (strcmp(cmdbuf, "send") == 0) c.cmd = CMD_SEND; else if (strcmp(cmdbuf, "wait") == 0) c.cmd = CMD_WAIT; else if (strcmp(cmdbuf, "tcp_cork") == 0) c.cmd = CMD_CORK; else if (strcmp(cmdbuf, "tcp_nodelay") == 0) c.cmd = CMD_NODELAY; else if (strcmp(cmdbuf, "/etc/delay") == 0) c.cmd = CMD_DELAY; else if (strcmp(cmdbuf, "goto") == 0) c.cmd = CMD_GOTO; } scn->cmds[scn->cmd_count++] = c; } }
static PangoLayout* create_layout(HippoCanvasText *text, int allocation_width) { HippoCanvasBox *box = HIPPO_CANVAS_BOX(text); PangoLayout *layout; HippoCanvasStyle *style = hippo_canvas_context_get_style(HIPPO_CANVAS_CONTEXT(text)); g_return_val_if_fail(box->context != NULL, NULL); layout = hippo_canvas_context_create_layout(box->context); if (box->font_desc) { PangoFontDescription *merged = pango_font_description_copy(hippo_canvas_style_get_font(style)); pango_font_description_merge(merged, box->font_desc, TRUE); pango_layout_set_font_description(layout, merged); pango_font_description_free(merged); } else { pango_layout_set_font_description(layout, hippo_canvas_style_get_font(style)); } { PangoAttrList *attrs; HippoTextDecoration decoration = hippo_canvas_style_get_text_decoration(style); if (text->attributes) attrs = pango_attr_list_copy(text->attributes); else attrs = pango_attr_list_new(); if (ABS(1.0 - text->font_scale) > .000001) { PangoAttribute *attr = pango_attr_scale_new(text->font_scale); attr->start_index = 0; attr->end_index = G_MAXUINT; pango_attr_list_insert(attrs, attr); } if ((decoration & HIPPO_TEXT_DECORATION_UNDERLINE) != 0) { PangoAttribute *attr = pango_attr_underline_new(TRUE); attr->start_index = 0; attr->end_index = G_MAXUINT; pango_attr_list_insert(attrs, attr); } if ((decoration & HIPPO_TEXT_DECORATION_LINE_THROUGH) != 0) { PangoAttribute *attr = pango_attr_strikethrough_new(TRUE); attr->start_index = 0; attr->end_index = G_MAXUINT; pango_attr_list_insert(attrs, attr); } pango_layout_set_attributes(layout, attrs); pango_attr_list_unref(attrs); } if (text->text != NULL) { pango_layout_set_text(layout, text->text, -1); } if (allocation_width >= 0) { int layout_width, layout_height; pango_layout_get_size(layout, &layout_width, &layout_height); layout_width /= PANGO_SCALE; layout_height /= PANGO_SCALE; /* Force layout smaller if required, but we don't want to make * the layout _wider_ because it breaks alignment, so only do * this if required. */ if (layout_width > allocation_width) { pango_layout_set_width(layout, allocation_width * PANGO_SCALE); /* If we set ellipsize, then it overrides wrapping. If we get * too-small allocation for HIPPO_CANVAS_SIZE_FULL_WIDTH, then * we want to ellipsize instead of wrapping. */ if (text->size_mode == HIPPO_CANVAS_SIZE_WRAP_WORD) { pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE); } else { pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END); } /* For now if we say ellipsize end, we always just want one line. * Maybe this should be an orthogonal property? */ if (text->size_mode == HIPPO_CANVAS_SIZE_ELLIPSIZE_END) { pango_layout_set_single_paragraph_mode(layout, TRUE); /* Pango's line separator character in this case is ugly, so we * fix it. Not a very efficient approach, but oh well. */ if (text->text != NULL) { char *new_text = remove_newlines(text->text); /* avoid making the layout recompute everything * if we didn't have newlines anyhow */ if (strcmp(text->text, new_text) != 0) { pango_layout_set_text(layout, new_text, -1); } g_free(new_text); } } } } return layout; }
int countwords_HTML(SWISH *sw, FileProp *fprop, FileRec *fi, char *buffer) { int ftotalwords; int *metaID; int metaIDlen; int position; /* Position of word in file */ int currentmetanames; char *p, *newp, *tag, *endtag; int structure; FileRec *thisFileEntry = fi; struct metaEntry *metaNameEntry; IndexFILE *indexf = sw->indexlist; struct MOD_Index *idx = sw->Index; char *Content = NULL, *Name = NULL, *summary = NULL; char *title = (char *)sw_ConvHTMLEntities2ISO(sw, (unsigned char *)parseHTMLtitle(sw, buffer)); if (!isoktitle(sw, title)) return -2; if (fprop->stordesc) summary = parseHtmlSummary(buffer, fprop->stordesc->field, fprop->stordesc->size, sw); addCommonProperties( sw, fprop, fi, title, summary, 0 ); /* Init meta info */ metaID = (int *) Mem_ZoneAlloc(sw->Index->perDocTmpZone,(metaIDlen = 16) * sizeof(int)); currentmetanames = 0; ftotalwords = 0; structure = IN_FILE; metaID[0] = 1; position = 1; for (p = buffer; p && *p;) { /* Look for non escaped '<' */ if ((tag = strchr(p, '<')) && ((tag == p) || (*(tag - 1) != '\\'))) { /* Index up to the tag */ *tag++ = '\0'; newp = (char *)sw_ConvHTMLEntities2ISO(sw, (unsigned char *)p); if ( ! currentmetanames ) currentmetanames++; ftotalwords += indexstring(sw, newp, idx->filenum, structure, currentmetanames, metaID, &position); /* Now let us look for a not escaped '>' */ for (endtag = tag;;) if ((endtag = strchr(endtag, '>'))) { if (*(endtag - 1) != '\\') break; else endtag++; } else break; if (endtag) { *endtag++ = '\0'; if ((tag[0] == '!') && lstrstr(tag, "META") && (lstrstr(tag, "START") || lstrstr(tag, "END"))) { /* Check for META TAG TYPE 1 */ structure |= IN_META; if (lstrstr(tag, "START")) { char *parsed_tag; if ( (metaNameEntry = getHTMLMeta(indexf, tag, sw, NULL, &parsed_tag, fprop->real_path))) { /* realloc memory if needed */ if (currentmetanames == metaIDlen) { int *newbuf = (int *)Mem_ZoneAlloc(sw->Index->perDocTmpZone, metaIDlen * 2 * sizeof(int)); memcpy((char *)newbuf,(char *)metaID,metaIDlen * sizeof(int)); metaID = newbuf; metaIDlen *= 2; } /* add metaname to array of current metanames */ metaID[currentmetanames] = metaNameEntry->metaID; /* Bump position for all metanames unless metaname in dontbumppositionOnmetatags */ if (!isDontBumpMetaName(sw->dontbumpstarttagslist, metaNameEntry->metaName)) position++; currentmetanames++; p = endtag; /* If it is also a property store it until a < is found */ if ((metaNameEntry = getPropNameByName(&indexf->header, parsed_tag))) { if ((endtag = strchr(p, '<'))) *endtag = '\0'; p = (char *)sw_ConvHTMLEntities2ISO(sw, (unsigned char *)p); remove_newlines(p); /** why isn't this just done for the entire doc? */ if (!addDocProperty(&thisFileEntry->docProperties, metaNameEntry, (unsigned char *)p, strlen(p), 0)) progwarn("property '%s' not added for document '%s'\n", metaNameEntry->metaName, fprop->real_path); if (endtag) *endtag = '<'; continue; } } } else if (lstrstr(tag, "END")) { /* this will close the last metaname */ if (currentmetanames) { currentmetanames--; if (!currentmetanames) metaID[0] = 1; } } p = endtag; } /* Check for META TAG TYPE 2 */ else if ((tag[0] != '!') && lstrstr(tag, "META") && (Name = lstrstr(tag, "NAME")) && (Content = lstrstr(tag, "CONTENT"))) { ftotalwords += parseMetaData(sw, indexf, tag, idx->filenum, structure, Name, Content, thisFileEntry, &position, fprop->real_path); p = endtag; } /* Check for COMMENT */ else if ((tag[0] == '!') && sw->indexComments) { ftotalwords += parsecomment(sw, tag, idx->filenum, structure, 1, &position); p = endtag; } /* Default: Continue */ else { structure = getstructure(tag, structure); p = endtag; } } else p = tag; /* tag not closed: continue */ } else { /* No more '<' */ newp = (char *)sw_ConvHTMLEntities2ISO(sw, (unsigned char *)p); if ( ! currentmetanames ) currentmetanames++; ftotalwords += indexstring(sw, newp, idx->filenum, structure, currentmetanames, metaID, &position); p = NULL; } } return ftotalwords; }
static char *parseHtmlSummary(char *buffer, char *field, int size, SWISH * sw) { char *p, *q, *tag, *endtag, c = '\0'; char *summary, *beginsum, *endsum, *tmp, *tmp2, *tmp3; int found, lensummary; /* Get the summary if no metaname/field is given */ if (!field && size) { /* Jump title if it exists */ if ((p = lstrstr(buffer, "</title>"))) { p += 8; } else p = buffer; /* Let us try to find <body> */ if ((q = lstrstr(p, "<body"))) { q = strchr(q, '>'); } else q = p; summary = (char *) Mem_ZoneAlloc(sw->Index->perDocTmpZone,strlen(p)+1); strcpy(summary,p); remove_newlines(summary); //$$$$ Todo: remove tag and content of scripts, css, java, embeddedobjects, comments, etc remove_tags(summary); summary = (char *)sw_ConvHTMLEntities2ISO(sw, (unsigned char *)summary); /* use only the required memory -save those not used */ /* 2001-03-13 rasc copy only <size> bytes of string */ if((int) strlen(summary) > size) summary[size]='\0'; return summary; } for (p = buffer, summary = NULL, found = 0, beginsum = NULL, endsum = NULL; p && *p;) { if ((tag = strchr(p, '<')) && ((tag == p) || (*(tag - 1) != '\\'))) { /* Look for non escaped '<' */ tag++; for (endtag = tag;;) if ((endtag = strchr(endtag, '>'))) { if (*(endtag - 1) != '\\') break; else endtag++; } else break; if (endtag) { c = *endtag; *endtag++ = '\0'; if ((tag[0] == '!') && lstrstr(tag, "META") && (lstrstr(tag, "START") || lstrstr(tag, "END"))) { /* Check for META TAG TYPE 1 */ if (lstrstr(tag, "START")) { if ((tmp = lstrstr(tag, "NAME"))) { tmp += 4; if (lstrstr(tmp, field)) { beginsum = endtag; found = 1; } p = endtag; } else p = endtag; } else if (lstrstr(tag, "END")) { if (!found) { p = endtag; } else { endsum = tag - 1; *(endtag - 1) = c; break; } } } /* Check for META TAG TYPE 2 */ else if ((tag[0] != '!') && lstrstr(tag, "META") && (tmp = lstrstr(tag, "NAME")) && (tmp2 = lstrstr(tag, "CONTENT"))) { tmp += 4; tmp3 = lstrstr(tmp, field); if (tmp3 && tmp3 < tmp2) { tmp2 += 7; if ((tmp = strchr(tmp2, '='))) { for (++tmp; isspace((int) ((unsigned char) *tmp)); tmp++); if (*tmp == '\"') { beginsum = tmp + 1; for (tmp = endtag - 1; tmp > beginsum; tmp--) if (*tmp == '\"') break; if (tmp == beginsum) endsum = endtag - 1; else endsum = tmp; } else { beginsum = tmp; endsum = endtag - 1; } found = 1; *(endtag - 1) = c; break; } } p = endtag; } /* Default: Continue */ else { p = endtag; } } else p = NULL; /* tag not closed ->END */ if (endtag) *(endtag - 1) = c; } else { /* No more '<' */ p = NULL; } } if (found && beginsum && endsum && endsum > beginsum) { lensummary = endsum - beginsum; summary = (char *)Mem_ZoneAlloc(sw->Index->perDocTmpZone, lensummary + 1); memcpy(summary, beginsum, lensummary); summary[lensummary] = '\0'; } /* If field is set an no metaname is found, let us search */ /* for something like <field>bla bla </field> */ if (!summary && field) { summary = parsetag(sw, field, buffer, 0, CASE_SENSITIVE_OFF); } /* Finally check for something after title (if exists) and */ /* after <body> (if exists) */ if (!summary) { /* Jump title if it exists */ if ((p = lstrstr(buffer, "</title>"))) { p += 8; } else p = buffer; /* Let us try to find <body> */ if ((q = lstrstr(p, "<body"))) { q = strchr(q, '>'); } else q = p; summary = (char *)Mem_ZoneAlloc(sw->Index->perDocTmpZone,strlen(q) + 1); strcpy(summary,q); } if (summary) { remove_newlines(summary); remove_tags(summary); summary = (char *)sw_ConvHTMLEntities2ISO(sw, (unsigned char *)summary); } if (summary && size && ((int) strlen(summary)) > size) summary[size] = '\0'; return summary; }
/* Parses the Meta tag */ static int parseMetaData(SWISH * sw, IndexFILE * indexf, char *tag, int filenum, int structure, char *name, char *content, FileRec *thisFileEntry, int *position, char *filename) { int metaName; struct metaEntry *metaNameEntry; char *temp, *start, *convtag; int wordcount = 0; /* Word count */ char *parsed_tag; /* Lookup (or add if "auto") meta name for tag */ metaNameEntry = getHTMLMeta(indexf, tag, sw, name, &parsed_tag, filename); metaName = metaNameEntry ? metaNameEntry->metaID : 1; temp = content + 7; /* 7 is strlen("CONTENT") */ /* Get to the " sign disreguarding other characters */ if ((temp = strchr(temp, '\"'))) { structure |= IN_META; start = temp + 1; /* Jump escaped \" */ temp = strchr(start, '\"'); while (temp) { if (*(temp - 1) == '\\') temp = strchr(temp + 1, '\"'); else break; } if (temp) *temp = '\0'; /* terminate CONTENT, temporarily */ /* Convert entities, if requested, and remove newlines */ convtag = (char *)sw_ConvHTMLEntities2ISO(sw, (unsigned char *)start); remove_newlines(convtag); /** why isn't this just done for the entire doc? */ /* Index only if a metaEntry was found, or if not not ReqMetaName */ if ( sw->UndefinedMetaTags != UNDEF_META_IGNORE || metaNameEntry) { /* Meta tags get bummped */ /* I'm not clear this works as well as I'd like because it always bumps on a new Meta tag, * but in order to disable this behavior the name MUST be a meta name. * Probably better to let getHTMLMeta() return the name as a string. */ if (!metaNameEntry || !isDontBumpMetaName(sw->dontbumpstarttagslist, metaNameEntry->metaName)) position[0]++; wordcount = indexstring(sw, convtag, filenum, structure, 1, &metaName, position); if (!metaNameEntry || !isDontBumpMetaName(sw->dontbumpendtagslist, metaNameEntry->metaName)) position[0]++; } /* If it is a property store it */ if ((metaNameEntry = getPropNameByName(&indexf->header, parsed_tag))) if (!addDocProperty(&thisFileEntry->docProperties, metaNameEntry, (unsigned char*)convtag, strlen(convtag), 0)) progwarn("property '%s' not added for document '%s'\n", metaNameEntry->metaName, filename); if (temp) *temp = '\"'; /* restore string */ } return wordcount; }