#help_index "DolDoc/Misc"

CColorROPU32 highlight_hash_type_colors[HTt_TYPES_NUM]=
        DOC_COLOR_EXPORT_SYS_SYM,0,DOC_COLOR_DEFINE_STR,DOC_COLOR_GLBL_VAR,
        DOC_COLOR_CLASS,DOC_COLOR_KEYWORD,DOC_COLOR_FUN,0,0,DOC_COLOR_KEYWORD,
        DOC_COLOR_KEYWORD,DOC_COLOR_KEYWORD,DOC_COLOR_REG,0,0,0,0};

U32 *DocHighlight(CDocEntry *doc_e,U8 *src,I64 len,I64 _tmp_u32_attr)
{//Be aware of ::/Demo/ToHtmlToTXTDemo/ToHtml.HC.
  U32 *res=MAlloc((len+1)*sizeof(U32)),*dst=res;
  U8 *ptr;
  CDocSettings *s=&doc_e->settings;
  I64 ch,ch1,last_ch,tmp_u32_attr,mask_tmp_u32_attr=_tmp_u32_attr&0xFFFFF000,
        comment_depth,brace_depth=s->brace_depth,paren_depth=s->paren_depth;
  CHash *tmph;
  switch [s->state] {
    case DOCSS_NORMAL:
hl_normal:
      while (len) {
        while (len && !Bt(char_bmp_alpha_numeric,*src)) {
          tmp_u32_attr=_tmp_u32_attr;
          ch1=*src++;
          switch (ch1) {
            case '/':
              if (len>=2) {
                if (*src=='/') {
                  tmp_u32_attr=DOC_COLOR_COMMENT<<8|mask_tmp_u32_attr;
                  *dst++=ch1+tmp_u32_attr;
                  *dst++=*src++ +tmp_u32_attr;
                  len-=2;
                  goto hl_cpp_comment;
                } else if (*src=='*') {
                  tmp_u32_attr=DOC_COLOR_COMMENT<<8|mask_tmp_u32_attr;
                  *dst++=ch1+tmp_u32_attr;
                  *dst++=*src++ +tmp_u32_attr;
                  len-=2;
                  comment_depth=1;
                  goto hl_comment;
                }
              }
              break;
            case '\'':
              tmp_u32_attr=DOC_COLOR_CHAR_CONST<<8|mask_tmp_u32_attr;
              *dst++=ch1+tmp_u32_attr;
              len--;
              goto hl_single_quote;
            case '\"':
              tmp_u32_attr=DOC_COLOR_STR<<8|mask_tmp_u32_attr;
              *dst++=ch1+tmp_u32_attr;
              len--;
              goto hl_dbl_quote;
            case '(':
              if (paren_depth++&1)
                tmp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_tmp_u32_attr;
              break;
            case ')':
              if (--paren_depth&1)
                tmp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_tmp_u32_attr;
              break;
            case '{':
              if (brace_depth++&1)
                tmp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_tmp_u32_attr;
              break;
            case '}':
              if (--brace_depth&1)
                tmp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_tmp_u32_attr;
              break;
          }
          *dst++=ch1+tmp_u32_attr;
          if (!--len) goto hl_normal_done;
        }
        ptr=src;
        while (len && Bt(char_bmp_alpha_numeric,*src)) {
          src++;
          len--;
        }
        ch=*src;
        *src=0;
        if (tmph=HashFind(ptr,adam_task->hash_table,
              HTT_EXPORT_SYS_SYM|HTT_DEFINE_STR|HTT_GLBL_VAR|HTT_CLASS|
              HTT_INTERNAL_TYPE|HTT_FUN|HTT_KEYWORD|HTT_ASM_KEYWORD|
              HTT_OPCODE|HTT_REG))
          tmp_u32_attr=highlight_hash_type_colors[HashTypeNum(tmph)]<<8|
                mask_tmp_u32_attr;
        else
          tmp_u32_attr=_tmp_u32_attr;
        while (ch1=*ptr++)
          *dst++=ch1+tmp_u32_attr;
        *src=ch;
      }
hl_normal_done:
      s->state=DOCSS_NORMAL;
      s->comment_depth=0;
      break;
    case DOCSS_SINGLE_QUOTE:
      tmp_u32_attr=DOC_COLOR_CHAR_CONST<<8|mask_tmp_u32_attr;
hl_single_quote:
      last_ch=0;
      while (len--) {
        ch1=*src++;
        *dst++=ch1+tmp_u32_attr;
        if (last_ch!='\\' && ch1=='\'')
          goto hl_normal;
        if (last_ch=='\\' && ch1=='\\')
          last_ch=0;
        else
          last_ch=ch1;
      }
      s->state=DOCSS_SINGLE_QUOTE;
      s->comment_depth=0;
      break;
    case DOCSS_DBL_QUOTE:
      tmp_u32_attr=DOC_COLOR_CHAR_CONST<<8|mask_tmp_u32_attr;
hl_dbl_quote:
      last_ch=0;
      while (len--) {
        ch1=*src++;
        *dst++=ch1+tmp_u32_attr;
        if (last_ch!='\\' && ch1=='\"')
          goto hl_normal;
        if (last_ch=='\\' && ch1=='\\')
          last_ch=0;
        else
          last_ch=ch1;
      }
      s->state=DOCSS_DBL_QUOTE;
      s->comment_depth=0;
      break;
    case DOCSS_COMMENT:
      tmp_u32_attr=DOC_COLOR_COMMENT<<8|mask_tmp_u32_attr;
      comment_depth=s->comment_depth;
hl_comment:
      last_ch=0;
      while (len--) {
        ch1=*src++;
        *dst++=ch1+tmp_u32_attr;
        if (last_ch=='*' && ch1=='/') {
          if (!--comment_depth)
            goto hl_normal;
        } else if (last_ch=='/' && ch1=='*')
          comment_depth++;
        last_ch=ch1;
      }
      s->state=DOCSS_COMMENT;
      s->comment_depth=comment_depth;
      break;
    case DOCSS_CPP_Z_COMMENT:
      tmp_u32_attr=DOC_COLOR_COMMENT<<8|mask_tmp_u32_attr;
hl_cpp_comment:
      while (len--)
        *dst++=*src++ +tmp_u32_attr;
      s->state=DOCSS_CPP_Z_COMMENT;
      s->comment_depth=0;
      break;
  }
  s->paren_depth=paren_depth;
  s->brace_depth=brace_depth;
  *dst=0;
  return res;
}