summaryrefslogtreecommitdiff
path: root/BeagleBoardPkg/Tools/replace.c
blob: d26d1274811f852121ea9e5e952b191a987d0e90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//
// Quick hack to work around not having sed, or any other reasonable 
// way to edit a file from a script on Windows......
//
// Copyright (c) 2010, Apple Inc. All rights reserved.
//  
//  All rights reserved. This program and the accompanying materials
//  are licensed and made available under the terms and conditions of the BSD License
//  which accompanies this distribution.  The full text of the license may be found at
//  http://opensource.org/licenses/bsd-license.php
//
//  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
//  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define TRUE  1
#define FALSE 0

typedef struct {
  char  *Match;
  int   MatchSize;
  char  *Replace;
} MATCH_PAIR;

//
// argv[1] - Old File
// argv[2] - New File
// argv[3+n] - Match String
// argv[4+n] - Replace string 
int
main (int argc, char **argv)
{
  FILE *In, *Out;
  char *Key, *Replace;
  int  c, i, n, Len, MaxLenKey = 0, MinLenKey = INT_MAX;
  unsigned long  InFileSize, InFilePos;
  MATCH_PAIR *Match;
  int MaxMatch;
  int ReadCount;
  int Found;

  if (argc < 5) {
    // Need at least two files and two strings
    return -1;
  } else if ((argc % 2) == 0) {
    // Match and Replace string must come in pairs
    return -4;
  }

  In  = fopen (argv[1], "r");
  fseek (In, 0, SEEK_END);
  InFileSize = ftell (In);
  if (InFileSize == 0) {
    return -6;
  }
  fseek (In, 0, SEEK_SET);


  Out = fopen (argv[2], "w+");
  if ((In == NULL) || (Out == NULL)) {
    return -2;
  }

  MaxMatch = (argc - 2)/2;
  printf ("\nMaxMatch = %d:%d\n", MaxMatch, argc);
  Match = calloc (MaxMatch, sizeof (MATCH_PAIR));
  if (Match == NULL) {
    return -7;
  }

  for (n=0; n < MaxMatch; n++) {
    Match[n].Match   = argv[3 + n*2];
    Match[n].MatchSize = strlen (argv[3 + n*2]);
    Match[n].Replace = argv[3 + n*2 + 1];
printf ("%s > %s\n", Match[n].Match, Match[n].Replace);
    if (Match[n].MatchSize > MaxLenKey) {
      // Max size of match/replace string pair
      MaxLenKey = Match[n].MatchSize;
    }
    if (Match[n].MatchSize < MinLenKey) {
      MinLenKey = Match[n].MatchSize;
    }
  }

  Key = malloc (MaxLenKey);
  if (Key == NULL) {
    return -5;
  }

  InFilePos = 0;
  while (InFilePos < (InFileSize - MinLenKey)) {
    fseek (In, InFilePos, SEEK_SET);
    ReadCount = fread (Key, 1, MaxLenKey, In);
    for (i = 0, Found = FALSE;i < MaxMatch; i++) {
      if (ReadCount >= Match[i].MatchSize) {
        if (!memcmp (Key, Match[i].Match, Match[i].MatchSize)) {
          printf ("Found [%s] @ %u\n", Match[i].Match, InFilePos);
          InFilePos += (Match[i].MatchSize - 1);
          printf ("InFilePos = %u", InFilePos);
          fputs (Match[i].Replace, Out);
          Found = TRUE;
          break;
        }
      }
    }
    if (!Found) {
      fputc (Key[0], Out);
    }
 
    InFilePos++;
  }

 
  fclose (In);
  fclose (Out);
  free (Key);
  return 0;
}