Author: dgorbachev
Date: Sat May  2 03:34:50 2009
New Revision: 40768
URL: 
http://svn.reactos.org/svn/reactos?rev=40768&view=rev
Log:
- Update log2lines tool by J. Roeloffzen. Bug #4342.
- Move it to where raddr2line lives now.
Added:
    trunk/reactos/tools/rsym/log2lines.c   (contents, props changed)
      - copied, changed from r40766, trunk/reactos/tools/log2lines.c
    trunk/reactos/tools/rsym/log2lines.mak   (props changed)
      - copied unchanged from r40766, trunk/reactos/tools/log2lines.mak
Removed:
    trunk/reactos/tools/log2lines.c
    trunk/reactos/tools/log2lines.mak
Modified:
    trunk/reactos/tools/tools.mak
Removed: trunk/reactos/tools/log2lines.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/log2lines.c?rev=4076…
==============================================================================
--- trunk/reactos/tools/log2lines.c [iso-8859-1] (original)
+++ trunk/reactos/tools/log2lines.c (removed)
@@ -1,1098 +1,0 @@
-/*
- * Usage: log2lines [-cd:fFhmrv] [<exefile> <offset>]
- * Try log2lines -h
- *
- * This is a tool and is compiled using the host compiler,
- * i.e. on Linux gcc and not mingw-gcc (cross-compiler).
- * Therefore we can't include SDK headers and we have to
- * duplicate some definitions here.
- * Also note that the internal functions are "old C-style",
- * returning an int, where a return of 0 means success and
- * non-zero is failure.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <getopt.h>
-
-#include "rsym.h"
-
-#define LOG2LINES_VERSION   "0.6"
-
-#define INVALID_BASE    0xFFFFFFFFL
-
-#define DEF_OPT_DIR     "output-i386"
-
-#if defined (__DJGPP__) || defined (__WIN32__)
-
-#define DEV_NULL        "NUL"
-#define DOS_PATHS
-#define PATH_CHAR       '\\'
-#define PATH_STR        "\\"
-#define PATHCMP         strcasecmp
-#define CP_CMD          "copy /Y "
-#define DIR_FMT         "dir /a:-d /s /b %s > %s"
-
-#else  /* not defined (__DJGPP__) || defined (__WIN32__) */
-
-#include <errno.h>
-#include <limits.h>
-
-#define MAX_PATH        PATH_MAX
-#define DEV_NULL        "/dev/null"
-#define UNIX_PATHS
-#define PATH_CHAR       '/'
-#define PATH_STR        "/"
-#define PATHCMP         strcmp
-#define CP_CMD          "cp -f "
-#define DIR_FMT         "find %s -type f > %s"
-
-#endif  /* not defined (__DJGPP__) || defined (__WIN32__) */
-
-#define CP_FMT          CP_CMD "%s %s > " DEV_NULL
-
-#define CMD_7Z          "7z"
-#define UNZIP_FMT       "%s x -y -r %s -o%s > " DEV_NULL
-#define UNZIP_FMT_CAB \
-"%s x -y -r %s" PATH_STR "reactos" PATH_STR "reactos.cab
-o%s" PATH_STR "reactos" PATH_STR "reactos > " DEV_NULL
-
-#define LINESIZE        1024
-
-struct entry_struct
-{
-    char *buf;
-    char *name;
-    char *path;
-    size_t ImageBase;
-    struct entry_struct *pnext;
-};
-
-typedef struct entry_struct CACHE_ENTRY;
-
-struct cache_struct
-{
-    off_t st_size;
-    CACHE_ENTRY *phead;
-    CACHE_ENTRY *ptail;
-};
-
-typedef struct cache_struct CACHE;
-
-static CACHE cache;
-
-static char *optchars  = "cd:fFhl:mMrvz:";
-static int opt_help    = 0;         // -h
-static int opt_force   = 0;         // -f
-static int opt_exit    = 0;         // -e
-static int opt_verbose = 0;         // -v
-static int opt_console = 0;         // -c
-static int opt_mark    = 0;         // -m
-static int opt_Mark    = 0;         // -M
-static int opt_raw     = 0;         // -r
-static char opt_dir[MAX_PATH];      // -d
-static char opt_logFile[MAX_PATH];  // -l
-static char opt_7z[MAX_PATH];       // -z
-static FILE *logFile   = NULL;
-
-static char *cache_name;
-static char *tmp_name;
-
-static char *
-basename(char *path)
-{
-    char *base;
-
-    base = strrchr(path, PATH_CHAR);
-    if (base)
-    {
-        return ++base;
-    }
-    return path;
-}
-
-static size_t
-fixup_offset(size_t ImageBase, size_t offset)
-{
-    if (offset >= ImageBase)
-        offset -= ImageBase;
-    return offset;
-}
-
-static PIMAGE_SECTION_HEADER
-find_rossym_section(PIMAGE_FILE_HEADER PEFileHeader, PIMAGE_SECTION_HEADER
PESectionHeaders)
-{
-    size_t i;
-    for (i = 0; i < PEFileHeader->NumberOfSections; i++)
-    {
-        if (0 == strcmp((char *)PESectionHeaders[i].Name, ".rossym"))
-            return &PESectionHeaders[i];
-    }
-    return NULL;
-}
-
-static int
-find_and_print_offset(void *data, size_t offset, char *toString)
-{
-    PSYMBOLFILE_HEADER RosSymHeader = (PSYMBOLFILE_HEADER) data;
-    PROSSYM_ENTRY Entries = (PROSSYM_ENTRY) ((char *)data +
RosSymHeader->SymbolsOffset);
-    char *Strings = (char *)data + RosSymHeader->StringsOffset;
-    size_t symbols = RosSymHeader->SymbolsLength / sizeof (ROSSYM_ENTRY);
-    size_t i;
-
-    //if (RosSymHeader->SymbolsOffset)
-
-    for (i = 0; i < symbols; i++)
-    {
-        if (Entries[i].Address > offset)
-        {
-            if (!i--)
-                return 1;
-            else
-            {
-                PROSSYM_ENTRY e = &Entries[i];
-                if (toString)
-                {  // put in toString if provided
-                    snprintf(toString, LINESIZE, "%s:%u (%s)",
-                             &Strings[e->FileOffset],
-                             (unsigned int)e->SourceLine,
-                             &Strings[e->FunctionOffset]);
-                    return 0;
-                }
-                else
-                {  // to stdout
-                    printf("%s:%u (%s)\n", &Strings[e->FileOffset],
-                           (unsigned int)e->SourceLine,
-                           &Strings[e->FunctionOffset]);
-                    return 0;
-                }
-            }
-        }
-    }
-    return 1;
-}
-
-static int
-process_data(const void *FileData, size_t FileSize, size_t offset, char *toString)
-{
-    PIMAGE_DOS_HEADER PEDosHeader;
-    PIMAGE_FILE_HEADER PEFileHeader;
-    PIMAGE_OPTIONAL_HEADER PEOptHeader;
-    PIMAGE_SECTION_HEADER PESectionHeaders;
-    PIMAGE_SECTION_HEADER PERosSymSectionHeader;
-    size_t ImageBase;
-    int res;
-
-    /* Check if MZ header exists */
-    PEDosHeader = (PIMAGE_DOS_HEADER) FileData;
-    if (PEDosHeader->e_magic != IMAGE_DOS_MAGIC || PEDosHeader->e_lfanew == 0L)
-    {
-        perror("Input file is not a PE image.\n");
-        return 1;
-    }
-
-    /* Locate PE file header */
-    /* sizeof(ULONG) = sizeof(MAGIC) */
-    PEFileHeader = (PIMAGE_FILE_HEADER) ((char *)FileData + PEDosHeader->e_lfanew +
sizeof (ULONG));
-
-    /* Locate optional header */
-    PEOptHeader = (PIMAGE_OPTIONAL_HEADER) (PEFileHeader + 1);
-    ImageBase = PEOptHeader->ImageBase;
-
-    /* Locate PE section headers */
-    PESectionHeaders = (PIMAGE_SECTION_HEADER) ((char *)PEOptHeader +
PEFileHeader->SizeOfOptionalHeader);
-
-    /* make sure offset is what we want */
-    offset = fixup_offset(ImageBase, offset);
-
-    /* find rossym section */
-    PERosSymSectionHeader = find_rossym_section(PEFileHeader, PESectionHeaders);
-    if (!PERosSymSectionHeader)
-    {
-        fprintf(stderr, "Couldn't find rossym section in executable\n");
-        return 1;
-    }
-    res = find_and_print_offset((char *)FileData +
PERosSymSectionHeader->PointerToRawData, offset, toString);
-    if (res)
-    {
-        if (toString)
-        {
-            sprintf(toString, "??:0\n");
-        }
-        else
-        {
-            printf("??:0\n");
-        }
-    }
-
-    return res;
-}
-
-static long
-my_atoi(const char *a)
-{
-    int i = 0;
-    const char *fmt = "%x";
-
-    if (*a == '0')
-    {
-        switch (*++a)
-        {
-        case 'x':
-            fmt = "%x";
-            ++a;
-            break;
-        case 'd':
-            fmt = "%d";
-            ++a;
-            break;
-        default:
-            fmt = "%o";
-            break;
-        }
-    }
-    sscanf(a, fmt, &i);
-    return i;
-}
-
-static int
-file_exists(char *name)
-{
-    FILE *f;
-
-    f = fopen(name, "r");
-    if (!f)
-    {
-        return 0;
-    }
-    fclose(f);
-    return 1;
-}
-
-static int
-process_file(const char *file_name, size_t offset, char *toString)
-{
-    void *FileData;
-    size_t FileSize;
-    int res = 1;
-
-    FileData = load_file(file_name, &FileSize);
-    if (!FileData)
-    {
-        fprintf(stderr, "An error occured loading '%s'\n", file_name);
-    }
-    else
-    {
-        res = process_data(FileData, FileSize, offset, toString);
-        free(FileData);
-    }
-    return res;
-}
-
-static int
-get_ImageBase(char *fname, size_t *ImageBase)
-{
-    IMAGE_DOS_HEADER PEDosHeader;
-    IMAGE_FILE_HEADER PEFileHeader;
-    IMAGE_OPTIONAL_HEADER PEOptHeader;
-
-    FILE *fr;
-    off_t readLen;
-    int res;
-
-    *ImageBase = INVALID_BASE;
-    fr = fopen(fname, "rb");
-    if (!fr)
-    {
-        if (opt_verbose)
-            fprintf(stderr, "get_ImageBase, cannot open '%s' (%s)\n",
fname, strerror(errno));
-        return 1;
-    }
-
-    readLen = fread(&PEDosHeader, sizeof (IMAGE_DOS_HEADER), 1, fr);
-    if (1 != readLen)
-    {
-        if (opt_verbose)
-            fprintf(stderr, "get_ImageBase %s, read error IMAGE_DOS_HEADER
(%s)\n", fname, strerror(errno));
-        fclose(fr);
-        return 2;
-    }
-
-    /* Check if MZ header exists */
-    if (PEDosHeader.e_magic != IMAGE_DOS_MAGIC || PEDosHeader.e_lfanew == 0L)
-    {
-        if (opt_verbose > 1)
-            fprintf(stderr, "get_ImageBase %s, MZ header missing\n", fname);
-        fclose(fr);
-        return 3;
-    }
-
-    /* Locate PE file header */
-    res = fseek(fr, PEDosHeader.e_lfanew + sizeof (ULONG), SEEK_SET);
-    readLen = fread(&PEFileHeader, sizeof (IMAGE_FILE_HEADER), 1, fr);
-    if (1 != readLen)
-    {
-        if (opt_verbose)
-            fprintf(stderr, "get_ImageBase %s, read error IMAGE_FILE_HEADER
(%s)\n", fname, strerror(errno));
-        return 4;
-    }
-
-    /* Locate optional header */
-    readLen = fread(&PEOptHeader, sizeof (IMAGE_OPTIONAL_HEADER), 1, fr);
-    if (1 != readLen)
-    {
-        if (opt_verbose)
-            fprintf(stderr, "get_ImageBase %s, read error IMAGE_OPTIONAL_HEADER
(%s)\n", fname, strerror(errno));
-        fclose(fr);
-        return 5;
-    }
-
-    /* Check if it's really an IMAGE_OPTIONAL_HEADER we are interested in */
-    if ((PEOptHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) &&
-        (PEOptHeader.Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC))
-    {
-        if (opt_verbose > 1)
-            fprintf(stderr, "get_ImageBase %s, not an
IMAGE_NT_OPTIONAL_HDR<32|64>\n", fname);
-        fclose(fr);
-        return 6;
-    }
-
-    *ImageBase = PEOptHeader.ImageBase;
-    fclose(fr);
-    return 0;
-}
-
-static CACHE_ENTRY *
-entry_delete(CACHE_ENTRY *pentry)
-{
-    if (!pentry)
-        return NULL;
-    if (pentry->buf)
-        free(pentry->buf);
-    free(pentry);
-    return NULL;
-}
-
-static CACHE_ENTRY *
-entry_insert(CACHE_ENTRY *pentry)
-{
-    if (!pentry)
-        return NULL;
-    pentry->pnext = cache.phead;
-    cache.phead = pentry;
-    if (!cache.ptail)
-        cache.ptail = pentry;
-    return pentry;
-}
-
-#if 0
-static CACHE_ENTRY *
-entry_append(CACHE_ENTRY *pentry)
-{
-    if (!pentry)
-        return NULL;
-    if (!cache.ptail)
-        return entry_insert(pentry);
-    cache.ptail->pnext = pentry;
-    pentry->pnext = NULL;
-    cache.ptail = pentry;
-    return pentry;
-}
-#endif
-
-static CACHE_ENTRY *
-entry_create(char *Line)
-{
-    CACHE_ENTRY *pentry;
-    char *s = NULL;
-    int l;
-
-    if (!Line)
-        return NULL;
-
-    pentry = malloc(sizeof (CACHE_ENTRY));
-    if (!pentry)
-        return NULL;
-
-    l = strlen(Line);
-    pentry->buf = s = malloc(l + 1);
-    if (!s)
-    {
-        if (opt_verbose)
-            fprintf(stderr, "Alloc entry failed\n");
-        return entry_delete(pentry);
-    }
-
-    strcpy(s, Line);
-    if (s[l] == '\n')
-        s[l] = '\0';
-
-    pentry->name = s;
-    s = strchr(s, '|');
-    if (!s)
-    {
-        if (opt_verbose)
-            fprintf(stderr, "Name field missing\n");
-        return entry_delete(pentry);
-    }
-    *s++ = '\0';
-
-    pentry->path = s;
-    s = strchr(s, '|');
-    if (!s)
-    {
-        if (opt_verbose)
-            fprintf(stderr, "Path field missing\n");
-        return entry_delete(pentry);
-    }
-    *s++ = '\0';
-    if (1 != sscanf(s, "%x", &pentry->ImageBase))
-    {
-        if (opt_verbose)
-            fprintf(stderr, "ImageBase field missing\n");
-        return entry_delete(pentry);
-    }
-    return pentry;
-}
-
-static CACHE_ENTRY *
-entry_lookup(char *name)
-{
-    CACHE_ENTRY *pprev = NULL;
-    CACHE_ENTRY *pnext;
-
-    pnext = cache.phead;
-    while (pnext != NULL)
-    {
-        if (PATHCMP(name, pnext->name) == 0)
-        {
-            if (pprev)
-            {  // move to head for faster lookup next time
-                pprev->pnext = pnext->pnext;
-                pnext->pnext = cache.phead;
-                cache.phead = pnext;
-            }
-            return pnext;
-        }
-        pprev = pnext;
-        pnext = pnext->pnext;
-    }
-    return NULL;
-}
-
-static int
-read_cache(void)
-{
-    FILE *fr;
-    CACHE_ENTRY *pentry;
-    char *Line = NULL;
-    int result = 0;
-
-    //fprintf(stderr, "Reading cache ...\n");
-    Line = malloc(LINESIZE + 1);
-    if (!Line)
-    {
-        if (opt_verbose)
-            fprintf(stderr, "Alloc Line failed\n");
-        return 1;
-    }
-    Line[LINESIZE] = '\0';
-
-    fr = fopen(cache_name, "r");
-    if (!fr)
-    {
-        if (opt_verbose)
-            fprintf(stderr, "Open %s failed\n", cache_name);
-        free(Line);
-        return 2;
-    }
-    cache.phead = cache.ptail = NULL;
-
-    while (fgets(Line, LINESIZE, fr) != NULL)
-    {
-        pentry = entry_create(Line);
-        if (!pentry)
-        {
-            if (opt_verbose > 1)
-                fprintf(stderr, "** FAILED: %s\n", Line);
-        }
-        else
-        {
-            entry_insert(pentry);
-        }
-    }
-
-    fclose(fr);
-    free(Line);
-    return result;
-}
-
-static int
-create_cache(int force, int skipImageBase)
-{
-    FILE *fr, *fw;
-    char *Line = NULL, *Fname = NULL;
-    int len, err;
-    size_t ImageBase;
-
-    if ((fw = fopen(tmp_name, "w")) == NULL)
-    {
-        if (opt_verbose)
-            fprintf(stderr, "Apparently %s is not writable (mounted ISO?), using
current dir\n", tmp_name);
-        cache_name = basename(cache_name);
-        tmp_name = basename(tmp_name);
-    }
-    else
-    {
-        if (opt_verbose > 2)
-            fprintf(stderr, "%s is writable\n", tmp_name);
-        fclose(fw);
-        remove(tmp_name);
-    }
-
-    if (force)
-    {
-        if (opt_verbose > 2)
-            fprintf(stderr, "Removing %s ...\n", cache_name);
-        remove(cache_name);
-    }
-    else
-    {
-        if (file_exists(cache_name))
-        {
-            if (opt_verbose > 2)
-                fprintf(stderr, "Cache %s already exists\n", cache_name);
-            return 0;
-        }
-    }
-
-    Line = malloc(LINESIZE + 1);
-    if (!Line)
-        return 1;
-    Line[LINESIZE] = '\0';
-
-    remove(tmp_name);
-    fprintf(stderr, "Scanning %s ...\n", opt_dir);
-    snprintf(Line, LINESIZE, DIR_FMT, opt_dir, tmp_name);
-    system(Line);
-    fprintf(stderr, "Creating cache ...");
-
-    if ((fr = fopen(tmp_name, "r")) != NULL)
-    {
-        if ((fw = fopen(cache_name, "w")) != NULL)
-        {
-            while (fgets(Line, LINESIZE, fr) != NULL)
-            {
-                len = strlen(Line);
-                if (!len)
-                    continue;
-
-                Fname = Line + len - 1;
-                if (*Fname == '\n')
-                    *Fname = '\0';
-
-                while ((Fname > Line) && (*Fname != PATH_CHAR))
-                    Fname--;
-                if (*Fname == PATH_CHAR)
-                    Fname++;
-                if (*Fname && !skipImageBase)
-                {
-                    if ((err = get_ImageBase(Line, &ImageBase)) != 0)
-                    {
-                        if (opt_verbose > 2)
-                            fprintf(stderr, "%s|%s|%0x, ERR=%d\n", Fname, Line,
ImageBase, err);
-                    }
-                    else
-                    {
-                        fprintf(fw, "%s|%s|%0x\n", Fname, Line, ImageBase);
-                    }
-                }
-            }
-            fclose(fw);
-        }
-        fprintf(stderr, "... done\n");
-        fclose(fr);
-    }
-    remove(tmp_name);
-    free(Line);
-    return 0;
-}
-
-static int
-translate_file(const char *cpath, size_t offset, char *toString)
-{
-    size_t base = 0;
-    CACHE_ENTRY *pentry = NULL;
-    int res = 0;
-    char *path, *dpath;
-
-    /* First get the ImageBase of the File. If its smaller than the given
-     * Parameter, everything is ok, because it was already added onto the
-     * adress and can be given directly to process_file. If not, add it and
-     * give the result to process_file.
-     */
-    dpath = path = convert_path(cpath);
-    if (!path)
-    {
-        return 1;
-    }
-
-    // The path could be absolute:
-    if (get_ImageBase(path, &base))
-    {
-        pentry = entry_lookup(path);
-        if (pentry)
-        {
-            path = pentry->path;
-            base = pentry->ImageBase;
-            if (base == INVALID_BASE)
-            {
-                if (opt_verbose)
-                    fprintf(stderr, "No, or invalid base address: %s\n", path);
-                res = 2;
-            }
-        }
-        else
-        {
-            if (opt_verbose)
-                fprintf(stderr, "Not found in cache: %s\n", path);
-            res = 3;
-        }
-    }
-
-    if (!res)
-    {
-        offset = (base < offset) ? offset : base + offset;
-        res = process_file(path, offset, toString);
-    }
-
-    free(dpath);
-    return res;
-}
-
-static void
-translate_char(int c, FILE *outFile)
-{
-    fputc(c, outFile);
-    if (logFile)
-        fputc(c, logFile);
-}
-
-static void
-translate_line(FILE *outFile, char *Line, char *path, char *LineOut)
-{
-    size_t offset;
-    int cnt, res;
-    char *sep, *tail, *mark;
-    unsigned char ch;
-
-    if (!*Line)
-        return;
-    res = 1;
-    mark = "";
-    sep = strchr(Line, ':');
-    if (sep)
-    {
-        *sep = ' ';
-        cnt = sscanf(Line, "<%s %x%c", path, &offset, &ch);
-        if (cnt == 3 && ch == '>')
-        {
-            tail = strchr(Line, '>') + 1;
-            if (!(res = translate_file(path, offset, LineOut)))
-            {
-                mark = opt_mark ? "* " : "";
-                fprintf(outFile, "%s<%s:%x (%s)>%s", mark, path, offset,
LineOut, tail);
-                if (logFile)
-                    fprintf(logFile, "%s<%s:%x (%s)>%s", mark, path,
offset, LineOut, tail);
-            }
-            else
-            {
-                *sep = ':';  // restore because not translated
-                mark = opt_Mark ? "? " : "";
-            }
-        }
-    }
-    if (res)
-    {
-        fprintf(outFile, "%s%s", mark, Line);  // just copy
-        if (logFile)
-            fprintf(logFile, "%s%s", mark, Line);  // just copy
-    }
-    memset(Line, '\0', LINESIZE);  // flushed
-}
-
-static int
-translate_files(FILE * inFile, FILE * outFile)
-{
-    char *Line = malloc(LINESIZE + 1);
-    char *path = malloc(LINESIZE + 1);
-    char *LineOut = malloc(LINESIZE + 1);
-    int c;
-    unsigned char ch;
-    int i = 0;
-
-    if (Line && path && LineOut)
-    {
-        memset(Line, '\0', LINESIZE + 1);
-        if (opt_console)
-        {
-            while ((c = fgetc(inFile)) != EOF)
-            {
-                ch = (unsigned char)c;
-                if (!opt_raw)
-                {
-                    switch (ch)
-                    {
-                    case '\n':
-                        translate_line(outFile, Line, path, LineOut);
-                        i = 0;
-                        translate_char(c, outFile);
-                        break;
-                    case '<':
-                        i = 0;
-                        Line[i++] = ch;
-                        break;
-                    case '>':
-                        if (i)
-                        {
-                            if (i < LINESIZE)
-                            {
-                                Line[i++] = ch;
-                                translate_line(outFile, Line, path, LineOut);
-                            }
-                            else
-                            {
-                                translate_line(outFile, Line, path, LineOut);
-                                translate_char(c, outFile);
-                            }
-                            i = 0;
-                        }
-                        else
-                        {
-                            translate_char(c, outFile);
-                        }
-                        i = 0;
-                        break;
-                    default:
-                        if (i)
-                        {
-                            if (i < LINESIZE)
-                            {
-                                Line[i++] = ch;
-                            }
-                            else
-                            {
-                                translate_line(outFile, Line, path, LineOut);
-                                translate_char(c, outFile);
-                                i = 0;
-                            }
-                        }
-                        else
-                        {
-                            translate_char(c, outFile);
-                        }
-                    }
-                }
-                else
-                {
-                    translate_char(c, outFile);
-                }
-            }
-        }
-        else
-        {  // Line by line, slightly faster but less interactive
-            while (fgets(Line, LINESIZE, inFile) != NULL)
-            {
-                if (!opt_raw)
-                {
-                    translate_line(outFile, Line, path, LineOut);
-                }
-                else
-                {
-                    fprintf(outFile, "%s", Line);  // just copy
-                    if (logFile)
-                        fprintf(logFile, "%s", Line);  // just copy
-                }
-            }
-        }
-    }
-    free(LineOut);
-    free(Line);
-    free(path);
-    return 0;
-}
-
-static char *verboseUsage =
-"\n"
-"Description:\n"
-"  When <exefile> <offset> are given, log2lines works just like
raddr2line\n"
-"  Otherwise it reads stdin and tries to translate lines of the form:\n"
-"  <IMAGENAME:ADDRESS>\n\n"
-"  The result is written to stdout.\n"
-"  log2lines uses a cache in order to avoid a directory scan at each\n"
-"  image lookup, greatly increasing performance. Only image path and its\n"
-"  base address are cached.\n\n"
-"Options:\n"
-"  -c   Console mode. Outputs text per character instead of per line.\n"
-"       This is slightly slower but enables to see what you type.\n\n"
-"  -d <directory>|<ISO image>\n"
-"       Directory to scan for images. (Do not append a '" PATH_STR
"')\n"
-"       This option also takes an ISO image as argument:\n"
-"       - The image is recognized by the '.iso' extension.\n"
-"       - The image will be unpacked to a directory with the same name.\n"
-"       - The embedded reactos.cab file will also be unpacked.\n"
-"       - Combined with -f the file will be re-unpacked.\n"
-"       - NOTE: this ISO unpack feature needs 7z to be in the PATH.\n"
-"       Default: " DEF_OPT_DIR "\n\n"
-"  -f   Force creating new cache.\n\n"
-"  -F   As -f but exits immediately after creating cache.\n\n"
-"  -h   This text.\n\n"
-"  -l <logFile>\n"
-"       Append copy to specified logFile.\n"
-"       Default: no logFile\n\n"
-"  -m   Prefix (mark) each translated line with '* '.\n\n"
-"  -M   Prefix (mark) each NOT translated line with '? '.\n"
-"       ( Only for lines of the form: <IMAGENAME:ADDRESS> )\n\n"
-"  -r   Raw output without translation.\n\n"
-"  -v   Show detailed errors and tracing.\n"
-"       Repeating this option adds more verbosity.\n"
-"       Default: only (major) errors\n" "\n"
-"  -z <path to 7z>\n"
-"       Specify path to 7z.\n"
-"       Default: '7z'\n"
-"\n"
-"Examples:\n"
-"  Setup is a VMware machine with its serial port set to:
'\\\\.\\pipe\\kdbg'.\n\n"
-"  Just recreate cache after a svn update or a new module has been added:\n"
-"       log2lines -F\n\n" "  Use kdbg debugger via console
(interactive):\n"
-"       log2lines -c < \\\\.\\pipe\\kdbg\n\n"
-"  Use kdbg debugger via console, and append copy to logFile:\n"
-"       log2lines -c -l dbg.log < \\\\.\\pipe\\kdbg\n\n"
-"  Use kdbg debugger to send output to logfile:\n"
-"       log2lines < \\\\.\\pipe\\kdbg > dbg.log\n\n"
-"  Re-translate a debug log:\n"
-"       log2lines -d bootcd-38701-dbg.iso < bugxxxx.log\n\n"
-"\n";
-
-static void
-usage(int verbose)
-{
-    fprintf(stderr, "log2lines " LOG2LINES_VERSION "\n\n");
-    fprintf(stderr, "Usage: log2lines [-%s] [<exefile>
<offset>]\n", optchars);
-    if (verbose)
-    {
-        fprintf(stderr, verboseUsage);
-    }
-    else
-    {
-        fprintf(stderr, "Try log2lines -h\n");
-    }
-}
-
-static int
-unpack_iso(char *dir, char *iso)
-{
-    char Line[LINESIZE];
-    int res = 0;
-    char iso_tmp[MAX_PATH];
-    int  iso_copied = 0;
-    FILE *fiso;
-
-    strcpy(iso_tmp, iso);
-    if ((fiso = fopen(iso, "a")) == NULL)
-    {
-        if (opt_verbose)
-            fprintf(stderr, "Open of %s failed (locked), trying to copy
first\n", iso);
-
-        strcat(iso_tmp,"~");
-        remove(iso_tmp);
-        sprintf(Line, CP_FMT, iso, iso_tmp);
-        if (opt_verbose > 1)
-            fprintf(stderr, "Executing: %s\n", Line);
-        system(Line);
-        iso_copied = 1;
-    }
-    else
-    {
-        fclose(fiso);
-    }
-
-    sprintf(Line, UNZIP_FMT, opt_7z, iso_tmp, dir);
-    if (system(Line) < 0)
-    {
-        fprintf(stderr, "\nCannot unpack %s (check 7z path!)\n", iso_tmp);
-        if (opt_verbose)
-            fprintf(stderr, "Failed to execute: '%s'\n", Line);
-        res = 1;
-    }
-    else
-    {
-        if (opt_verbose > 1)
-            fprintf(stderr, "\nUnpacking reactos.cab in %s\n", dir);
-        sprintf(Line, UNZIP_FMT_CAB, opt_7z, dir, dir);
-        if (system(Line) < 0)
-        {
-            fprintf(stderr, "\nCannot unpack reactos.cab in %s\n", dir);
-            if (opt_verbose)
-                fprintf(stderr, "Failed to execute: '%s'\n", Line);
-            res = 2;
-        }
-    }
-    if (iso_copied)
-    {
-        remove(iso_tmp);
-    }
-    return res;
-}
-
-static int
-check_directory(int force)
-{
-    char freeldr_path[MAX_PATH];
-    char iso_path[MAX_PATH];
-
-    char *check_iso = strrchr(opt_dir, '.');
-    if (check_iso && PATHCMP(check_iso, ".iso") == 0)
-    {
-        if (opt_verbose)
-            fprintf(stderr, "Using ISO image: %s\n", opt_dir);
-        if (file_exists(opt_dir))
-        {
-            if (opt_verbose > 1)
-                fprintf(stderr, "ISO image exists: %s\n", opt_dir);
-
-            strcpy(iso_path, opt_dir);
-            *check_iso = '\0';
-            sprintf(freeldr_path, "%s" PATH_STR "freeldr.ini",
opt_dir);
-            if (!file_exists(freeldr_path) || force)
-            {
-                fprintf(stderr, "Unpacking %s to: %s ...", iso_path, opt_dir);
-                unpack_iso(opt_dir, iso_path);
-                fprintf(stderr, "... done\n");
-            }
-            else
-            {
-                if (opt_verbose > 1)
-                    fprintf(stderr, "%s already unpacked in: %s\n", iso_path,
opt_dir);
-            }
-        }
-        else
-        {
-            fprintf(stderr, "ISO image not found: %s\n", opt_dir);
-            return 1;
-        }
-    }
-    cache_name = malloc(MAX_PATH);
-    tmp_name = malloc(MAX_PATH);
-    strcpy(cache_name, opt_dir);
-    strcat(cache_name, PATH_STR "log2lines.cache");
-    strcpy(tmp_name, cache_name);
-    strcat(tmp_name, "~");
-    return 0;
-}
-
-int
-main(int argc, const char **argv)
-{
-    int res = 0;
-    int opt;
-    int optCount = 0;
-
-    strcpy(opt_dir, DEF_OPT_DIR);
-    strcpy(opt_logFile, "");
-    strcpy(opt_7z, CMD_7Z);
-    while (-1 != (opt = getopt(argc, (char **const)argv, optchars)))
-    {
-        switch (opt)
-        {
-        case 'c':
-            opt_console++;
-            break;
-        case 'd':
-            optCount++;
-            strcpy(opt_dir, optarg);
-            break;
-        case 'f':
-            opt_force++;
-            break;
-        case 'h':
-            opt_help++;
-            usage(1);
-            exit(0);
-            break;
-        case 'F':
-            opt_exit++;
-            opt_force++;
-            break;
-        case 'l':
-            optCount++;
-            strcpy(opt_logFile, optarg);
-            break;
-        case 'm':
-            opt_mark++;
-            break;
-        case 'M':
-            opt_Mark++;
-            break;
-        case 'r':
-            opt_raw++;
-            break;
-        case 'v':
-            opt_verbose++;
-            break;
-        case 'z':
-            optCount++;
-            strcpy(opt_7z, optarg);
-            break;
-        default:
-            usage(0);
-            exit(2);
-            break;
-        }
-        optCount++;
-    }
-
-    argc -= optCount;
-    if (argc != 1 && argc != 3)
-    {
-        usage(0);
-        exit(1);
-    }
-
-    if (check_directory(opt_force))
-        exit(3);
-
-    create_cache(opt_force, 0);
-    if (opt_exit)
-        exit(0);
-
-    read_cache();
-
-    if (*opt_logFile)
-    {
-        logFile = fopen(opt_logFile, "a");
-        if (logFile)
-        {
-            // disable buffering so fflush is not needed
-            setbuf(logFile,NULL);
-        }
-        else
-        {
-            fprintf(stderr, "Could not open logfile %s (%s)\n", opt_logFile,
strerror(errno));
-            exit(2);
-
-        }
-    }
-    if (argc == 3)
-    {  // translate <exefile> <offset>
-        translate_file(argv[optCount + 1], my_atoi(argv[optCount + 2]), NULL);
-    }
-    else
-    {  // translate logging from stdin
-        translate_files(stdin, stdout);
-    }
-
-    if (logFile)
-        fclose(logFile);
-    return res;
-}
Removed: trunk/reactos/tools/log2lines.mak
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/log2lines.mak?rev=40…
==============================================================================
--- trunk/reactos/tools/log2lines.mak [iso-8859-1] (original)
+++ trunk/reactos/tools/log2lines.mak (removed)
@@ -1,41 +1,0 @@
-LOG2LINES_BASE = $(TOOLS_BASE)
-LOG2LINES_BASE_ = $(LOG2LINES_BASE)$(SEP)
-
-LOG2LINES_INT = $(INTERMEDIATE_)$(LOG2LINES_BASE)
-LOG2LINES_INT_ = $(LOG2LINES_INT)$(SEP)
-LOG2LINES_OUT = $(OUTPUT_)$(LOG2LINES_BASE)
-LOG2LINES_OUT_ = $(LOG2LINES_OUT)$(SEP)
-
-LOG2LINES_TARGET = \
-       $(LOG2LINES_OUT_)log2lines$(EXEPOSTFIX)
-
-LOG2LINES_SOURCES = \
-       $(LOG2LINES_BASE_)log2lines.c \
-       $(LOG2LINES_BASE_)rsym_common.c
-
-LOG2LINES_OBJECTS = \
-       $(addprefix $(INTERMEDIATE_), $(LOG2LINES_SOURCES:.c=.o))
-
-LOG2LINES_HOST_CFLAGS = $(TOOLS_CFLAGS)
-
-LOG2LINES_HOST_LFLAGS = $(TOOLS_LFLAGS)
-
-.PHONY: log2lines
-log2lines: $(LOG2LINES_TARGET)
-
-$(LOG2LINES_TARGET): $(LOG2LINES_OBJECTS) | $(LOG2LINES_OUT)
-       $(ECHO_HOSTLD)
-       ${host_gcc} $(LOG2LINES_OBJECTS) $(LOG2LINES_HOST_LFLAGS) -o $@
-
-$(LOG2LINES_INT_)log2lines.o: $(LOG2LINES_BASE_)log2lines.c | $(LOG2LINES_INT)
-       $(ECHO_HOSTCC)
-       ${host_gcc} $(LOG2LINES_HOST_CFLAGS) -c $< -o $@
-
-#$(LOG2LINES_INT_)rsym_common.o: $(LOG2LINES_BASE_)rsym_common.c | $(LOG2LINES_INT)
-#      $(ECHO_HOSTCC)
-#      ${host_gcc} $(LOG2LINES_HOST_CFLAGS) -c $< -o $@
-
-.PHONY: log2lines_clean
-log2lines_clean:
-       -@$(rm) $(LOG2LINES_TARGET) $(LOG2LINES_OBJECTS) 2>$(NUL)
-clean: log2lines_clean
Copied: trunk/reactos/tools/rsym/log2lines.c (from r40766,
trunk/reactos/tools/log2lines.c)
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/rsym/log2lines.c?p2=…
==============================================================================
--- trunk/reactos/tools/log2lines.c [iso-8859-1] (original)
+++ trunk/reactos/tools/rsym/log2lines.c [iso-8859-1] Sat May  2 03:34:50 2009
@@ -18,7 +18,7 @@
 #include "rsym.h"
-#define LOG2LINES_VERSION   "0.6"
+#define LOG2LINES_VERSION   "0.8"
 #define INVALID_BASE    0xFFFFFFFFL
@@ -44,7 +44,7 @@
 #define UNIX_PATHS
 #define PATH_CHAR       '/'
 #define PATH_STR        "/"
-#define PATHCMP         strcmp
+#define PATHCMP         strcasecmp
 #define CP_CMD          "cp -f "
 #define DIR_FMT         "find %s -type f > %s"
@@ -81,7 +81,8 @@
 static CACHE cache;
-static char *optchars  = "cd:fFhl:mMrvz:";
+static char *optchars  = "bcd:fFhl:mMrvz:";
+static int opt_buffered= 0;         // -b
 static int opt_help    = 0;         // -h
 static int opt_force   = 0;         // -f
 static int opt_exit    = 0;         // -e
@@ -267,6 +268,29 @@
     }
     fclose(f);
     return 1;
+}
+
+static int
+copy_file(char *src, char *dst)
+{
+    char Line[LINESIZE];
+
+    sprintf(Line, CP_FMT, src, dst);
+    if (opt_verbose > 1)
+        fprintf(stderr, "Executing: %s\n", Line);
+    remove(dst);
+    if (file_exists(dst))
+    {
+        fprintf(stderr, "Cannot remove dst %s before copy\n", dst);
+        return 1;
+    }
+    system(Line);
+    if (!file_exists(dst))
+    {
+        fprintf(stderr, "Dst %s does not exist after copy \n", dst);
+        return 2;
+    }
+    return 0;
 }
 static int
@@ -833,6 +857,8 @@
 "  image lookup, greatly increasing performance. Only image path and its\n"
 "  base address are cached.\n\n"
 "Options:\n"
+"  -b   Use this combined with '-l'. Enable buffering on logFile.\n"
+"       This may solve loosing output on real hardware.\n\n"
 "  -c   Console mode. Outputs text per character instead of per line.\n"
 "       This is slightly slower but enables to see what you type.\n\n"
 "  -d <directory>|<ISO image>\n"
@@ -881,7 +907,7 @@
     fprintf(stderr, "Usage: log2lines [-%s] [<exefile>
<offset>]\n", optchars);
     if (verbose)
     {
-        fprintf(stderr, verboseUsage);
+        fprintf(stderr, "%s", verboseUsage);
     }
     else
     {
@@ -902,14 +928,11 @@
     if ((fiso = fopen(iso, "a")) == NULL)
     {
         if (opt_verbose)
-            fprintf(stderr, "Open of %s failed (locked), trying to copy
first\n", iso);
+            fprintf(stderr, "Open of %s failed (locked for writing?), trying to copy
first\n", iso);
         strcat(iso_tmp,"~");
-        remove(iso_tmp);
-        sprintf(Line, CP_FMT, iso, iso_tmp);
-        if (opt_verbose > 1)
-            fprintf(stderr, "Executing: %s\n", Line);
-        system(Line);
+        if (copy_file(iso,iso_tmp))
+            return 3;
         iso_copied = 1;
     }
     else
@@ -1005,6 +1028,9 @@
     {
         switch (opt)
         {
+        case 'b':
+            opt_buffered++;
+            break;
         case 'c':
             opt_console++;
             break;
@@ -1074,7 +1100,17 @@
         if (logFile)
         {
             // disable buffering so fflush is not needed
-            setbuf(logFile,NULL);
+            if (!opt_buffered)
+            {
+                if (opt_verbose)
+                    fprintf(stderr, "Disabling log buffering on %s\n",
opt_logFile);
+                setbuf(logFile,NULL);
+            }
+            else
+            {
+                if (opt_verbose)
+                    fprintf(stderr, "Enabling log buffering on %s\n",
opt_logFile);
+            }
         }
         else
         {
Propchange: trunk/reactos/tools/rsym/log2lines.c
------------------------------------------------------------------------------
    svn:eol-style = native
Propchange: trunk/reactos/tools/rsym/log2lines.c
------------------------------------------------------------------------------
    svn:mergeinfo =
Propchange: trunk/reactos/tools/rsym/log2lines.mak
------------------------------------------------------------------------------
    svn:eol-style = native
Propchange: trunk/reactos/tools/rsym/log2lines.mak
------------------------------------------------------------------------------
    svn:mergeinfo =
Modified: trunk/reactos/tools/tools.mak
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/tools.mak?rev=40768&…
==============================================================================
--- trunk/reactos/tools/tools.mak [iso-8859-1] (original)
+++ trunk/reactos/tools/tools.mak [iso-8859-1] Sat May  2 03:34:50 2009
@@ -43,7 +43,7 @@
 include tools/bin2c.mak
 include tools/buildno/buildno.mak
 include tools/gendib/gendib.mak
-include tools/log2lines.mak
+include tools/rsym/log2lines.mak
 include tools/nci/nci.mak
 ifeq ($(ARCH),powerpc)
 include tools/ofw_interface/ofw_interface.mak