#help_index "Cmd Line (Typically)"

CDirEntry MGFind(CDirEntry *needle_entry,CDirEntry *haystack_lst)
{
  while (haystack_lst) {
    if (!StrCmp(needle_entry->name,haystack_lst->name))
      return haystack_lst;
    haystack_lst=haystack_lst->next;
  }
  return NULL;
}

U0 Merge2(CDirEntry *tmpde1,CDirEntry *tmpde2,I64 *_fuf_flags,I64 *_df_flags)
{
  CDirEntry *tmpde;
  while (tmpde1 && !(*_df_flags & DF_ABORT_ALL_FILES)) {
    tmpde=MGFind(tmpde1,tmpde2);
    if (!tmpde)
      "$BROWN$Does Not Exist:%s$FG$\n",tmpde1->full_name;
    else {
      if (tmpde1->attr & RS_ATTR_DIR)
        Merge2(tmpde1->sub,tmpde->sub,_fuf_flags,_df_flags);
      else {
        if (AbsI64(tmpde1->datetime-tmpde->datetime)>CDATE_FREQ*2) {//slop
          "%s",tmpde1->full_name;
          '\n';
          if (Bt(_fuf_flags,FUf_DIFF)) {
            if (FilesFindMatch(tmpde1->full_name,FILEMASK_TXT))
              Diff(tmpde->full_name,tmpde1->full_name,_df_flags);
          }
        }
      }
    }
    tmpde1=tmpde1->next;
  }
}
public U0 Merge(U8 *dst_files_find_mask="/*",U8 *src_files_find_mask="/*",
  U8 *fu_flags=NULL)
{/*Merge text files from one list into another.
Report files whos date/time is different.

"+d" will do Diff() on files and prompt to
merge changes from source files into
destination files.
*/
  I64 df_flags=0,fuf_flags=0;
  CDirEntry *tmpde1=NULL,*tmpde2=NULL;
  ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),"+r");
  ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags);
  if (fuf_flags&~(FUG_FILES_FIND|FUF_DIFF))
    throw('FUF');
  PrintWarn("This is based strictly on file dates.\n");
  tmpde1=FilesFind(src_files_find_mask,fuf_flags&FUG_FILES_FIND);
  tmpde2=FilesFind(dst_files_find_mask,fuf_flags&FUG_FILES_FIND);
  fuf_flags&=FUF_DIFF;
  Merge2(tmpde1,tmpde2,&fuf_flags,&df_flags);
  DirTreeDel(tmpde1);
  DirTreeDel(tmpde2);
}

#help_index "Utils;Cmd Line (Typically)"

public U0 NewFiles(U8 *files_find_mask="/*",CDate cdt=0,U8 *fu_flags=NULL)
{//Report files newer than a certain date.
  I64 fuf_flags=0;
  CDirEntry *tmpde,*tmpde1;
  if (!cdt) cdt=sys_compile_time;
  ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),"+r+F");
  ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags);
  tmpde=tmpde1=FilesFind(files_find_mask,fuf_flags);
  while (tmpde) {
    if (tmpde->datetime>cdt)
      "%s\n",tmpde->full_name;
    tmpde=tmpde->next;
  }
  DirTreeDel(tmpde1);
}