Skip to content

Commit 1fe4de6

Browse files
committed
renamed define
1 parent 4593e5a commit 1fe4de6

3 files changed

Lines changed: 307 additions & 4 deletions

File tree

drivers/char/char_driver.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ Return_t TO_FUNCTION(DEVICE_NAME, _simple_read)(Device_t *device_, Byte_t *data_
194194
if(__PointerIsNotNull__(data_) && state.initialized) {
195195
Byte_t *byteData = null;
196196
Size_t bytesRead = 0x0u;
197-
state.currentByteCount = USART_SINGLE_BYTE_TRANSFER;
197+
state.currentByteCount = CHAR_SINGLE_BYTE_COUNT;
198198
if(OK(__CharDeviceReadRAW__(&byteData, &bytesRead))) {
199199
if(bytesRead > 0x0u) {
200200
*data_ = byteData[0x0u];
@@ -215,7 +215,7 @@ Return_t TO_FUNCTION(DEVICE_NAME, _simple_read)(Device_t *device_, Byte_t *data_
215215
Return_t TO_FUNCTION(DEVICE_NAME, _simple_write)(Device_t *device_, Byte_t data_) {
216216
FUNCTION_ENTER;
217217
if(state.initialized) {
218-
state.currentByteCount = USART_SINGLE_BYTE_TRANSFER;
218+
state.currentByteCount = CHAR_SINGLE_BYTE_COUNT;
219219
if(OK(__CharDeviceWriteRAW__(&data_))) {
220220
__ReturnOk__();
221221
} else {
@@ -294,9 +294,9 @@ static HalfWord_t __CircularBufferSpace__(const HalfWord_t head_,
294294
const HalfWord_t tail_,
295295
const HalfWord_t size_) {
296296
if(head_ >= tail_) {
297-
return (size_ - (head_ - tail_) - USART_SINGLE_BYTE_TRANSFER);
297+
return (size_ - (head_ - tail_) - CHAR_SINGLE_BYTE_COUNT);
298298
} else {
299-
return (tail_ - head_ - USART_SINGLE_BYTE_TRANSFER);
299+
return (tail_ - head_ - CHAR_SINGLE_BYTE_COUNT);
300300
}
301301
}
302302
static HalfWord_t __CircularBufferAvailable__(const HalfWord_t head_,

drivers/char/char_driver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#define CHAR_DEFAULT_RX_BUFFER_SIZE 0x100u
3535
#define CHAR_DEFAULT_TX_BUFFER_SIZE 0x100u
3636
#define CHAR_DEFAULT_TIMEOUT_MS 0x3E8u
37+
#define CHAR_SINGLE_BYTE_COUNT 0x1u
3738
typedef struct CharDeviceConfig_s {
3839
Byte_t command;
3940
HalfWord_t ioDriverUID;

replace_magic_numbers.py

Lines changed: 302 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,302 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Replace magic number literals with defined constants in C source files.
4+
Processes all .c files in src/ and drivers/ directories (excludes header files).
5+
"""
6+
7+
import os
8+
import re
9+
from pathlib import Path
10+
11+
12+
REPLACEMENTS = {
13+
'0xBu': 'FAT_83_NAME_LENGTH',
14+
'0x8u': 'FAT_83_BASENAME_LENGTH',
15+
'0x3u': 'FAT_83_EXTENSION_LENGTH',
16+
'0xE5u': 'FAT_ENTRY_DELETED',
17+
'0xFFu': 'FAT_BYTE_MASK',
18+
'0x8': 'FAT_BYTE_SHIFT_8',
19+
'0x10': 'FAT_BYTE_SHIFT_16',
20+
'0x18': 'FAT_BYTE_SHIFT_24',
21+
'0x10u': 'FAT_CLUSTER_HIGH_SHIFT',
22+
'0xFFFFu': 'FAT_CLUSTER_LOW_MASK',
23+
'0x2u': 'FAT_MIN_VALID_CLUSTER',
24+
'0x1u': 'FAT_CLUSTER_INCREMENT',
25+
'0x3u': 'FAT_MIN_SEARCH_CLUSTER',
26+
'0x10000u': 'FAT_MAX_SEARCHABLE_CLUSTERS',
27+
'0x100u': 'FAT_MAX_PATH_COMPONENT',
28+
'0x200u': 'FAT_DEFAULT_SECTOR_SIZE',
29+
'0x0FFFFFFFu': 'FAT32_ENTRY_MASK',
30+
'0xF0000000u': 'FAT32_RESERVED_BITS_MASK',
31+
'0x0FFFFFF8u': 'FAT32_MEDIA_DESCRIPTOR_ENTRY',
32+
'0x4u': 'FAT32_ENTRY_SIZE_BYTES',
33+
'0xEBu': 'FAT_BOOT_JMP_EB',
34+
'0x58u': 'FAT_BOOT_JMP_58',
35+
'0x90u': 'FAT_BOOT_JMP_90',
36+
'0x55u': 'FAT_BOOT_SIG_55',
37+
'0xAAu': 'FAT_BOOT_SIG_AA',
38+
'0xF8u': 'FAT_MEDIA_TYPE_HARD_DISK',
39+
'0x3Fu': 'FAT_DEFAULT_SECTORS_PER_TRACK',
40+
'0x80u': 'FAT_DRIVE_NUMBER_HDD',
41+
'0x29u': 'FAT_EXTENDED_BOOT_SIG',
42+
'0x1u': 'FAT_FSINFO_SECTOR',
43+
'0x6u': 'FAT_BACKUP_BOOT_SECTOR',
44+
'0x1': 'FAT_LE16_HIGH_BYTE_OFFSET',
45+
'0x2': 'FAT_CLUSTER_DATA_OFFSET',
46+
'0xB16B00B5u': 'CHECKSUM_XOR_CONSTANT',
47+
'0x3E8u': 'MS_PER_SECOND',
48+
'0x3E8': 'MS_PER_SECOND',
49+
'0x800u': 'FAT_DEFAULT_TOTAL_SECTORS',
50+
'0x12345678u': 'FAT_DEFAULT_VOLUME_ID',
51+
'0x1000u': 'FS_VOL_INFO_CLUSTER_LIMIT',
52+
'0x20u': 'FS_FORMAT_RESERVED_SECTORS',
53+
'0xFu': 'HEX_DIGIT_MASK',
54+
'0x1C200u': 'USART_MAX_BAUD_RATE',
55+
'0x5u': 'USART_IRQ_PRIORITY',
56+
}
57+
58+
59+
CONTEXT_SENSITIVE_REPLACEMENTS = {
60+
'fat.c': {
61+
'0x8u': 'FAT_83_BASENAME_LENGTH',
62+
'0x3u': 'FAT_83_EXTENSION_LENGTH',
63+
'0xBu': 'FAT_83_NAME_LENGTH',
64+
'0x100u': 'FAT_MAX_PATH_COMPONENT',
65+
'0x2u': 'FAT_MIN_VALID_CLUSTER',
66+
'0x10': 'FAT_BYTE_SHIFT_16',
67+
'0x8': 'FAT_BYTE_SHIFT_8',
68+
'0x18': 'FAT_BYTE_SHIFT_24',
69+
'0xFFu': 'FAT_BYTE_MASK',
70+
'0xE5u': 'FAT_ENTRY_DELETED',
71+
'0x0FFFFFFFu': 'FAT32_ENTRY_MASK',
72+
'0xF0000000u': 'FAT32_RESERVED_BITS_MASK',
73+
'0x4u': 'FAT32_ENTRY_SIZE_BYTES',
74+
'0x10000u': 'FAT_MAX_SEARCHABLE_CLUSTERS',
75+
'0x1': 'FAT_LE16_HIGH_BYTE_OFFSET',
76+
},
77+
'fs.c': {
78+
'0x200u': 'FS_DEFAULT_SECTOR_SIZE',
79+
'0xBu': 'FAT_83_NAME_LENGTH',
80+
'0x8u': 'FAT_83_BASENAME_LENGTH',
81+
'0x2u': 'FAT_MIN_VALID_CLUSTER',
82+
'0x100u': 'FS_PATH_BUFFER_SIZE',
83+
'0x1000u': 'FS_VOL_INFO_CLUSTER_LIMIT',
84+
'0xEBu': 'FAT_BOOT_JMP_EB',
85+
'0x58u': 'FAT_BOOT_JMP_58',
86+
'0x90u': 'FAT_BOOT_JMP_90',
87+
'0x55u': 'FAT_BOOT_SIG_55',
88+
'0xAAu': 'FAT_BOOT_SIG_AA',
89+
'0xF8u': 'FAT_MEDIA_TYPE_HARD_DISK',
90+
'0x3Fu': 'FAT_DEFAULT_SECTORS_PER_TRACK',
91+
'0x10u': 'FAT_DEFAULT_NUM_HEADS',
92+
'0x800u': 'FAT_DEFAULT_TOTAL_SECTORS',
93+
'0x80u': 'FAT_DRIVE_NUMBER_HDD',
94+
'0x29u': 'FAT_EXTENDED_BOOT_SIG',
95+
'0x12345678u': 'FAT_DEFAULT_VOLUME_ID',
96+
'0x0FFFFFF8u': 'FAT32_MEDIA_DESCRIPTOR_ENTRY',
97+
'0x0FFFFFFFu': 'FAT32_EOC_MAX',
98+
'0xFFFFu': 'FAT_CLUSTER_LOW_MASK',
99+
'0x10': 'FAT_CLUSTER_HIGH_SHIFT',
100+
},
101+
'mem.c': {
102+
'0xFFFFu': 'FLETCHER_MASK',
103+
'0x10u': 'CHECKSUM_WORD_SHIFT',
104+
'0x20u': 'CHECKSUM_DWORD_SHIFT',
105+
'0xB16B00B5u': 'CHECKSUM_XOR_CONSTANT',
106+
'0x4': 'MEM_ALIGN_SHIFT_4BIT',
107+
'0x100': 'BYTE_ORDER_TEST_VALUE',
108+
'0x10': 'CHECKSUM_WORD_SHIFT',
109+
},
110+
'console.c': {
111+
'0x10': 'CONSOLE_NUM_BUFFER_SIZE',
112+
'0x2': 'CONSOLE_ECHO_BUFFER_SIZE',
113+
'0x2u': 'PATH_SEGMENTS_DIVISOR',
114+
'0xFu': 'HEX_DIGIT_MASK',
115+
},
116+
'port.c': {
117+
'0x3E8': 'MS_PER_SECOND',
118+
},
119+
'usart_stm32_driver.c': {
120+
'0x1C200u': 'USART_MAX_BAUD_RATE',
121+
'0x5u': 'USART_IRQ_PRIORITY',
122+
'0x1u': 'USART_SINGLE_BYTE_TRANSFER',
123+
'0x3E8u': 'USART_DEFAULT_TIMEOUT_MS',
124+
},
125+
'char_driver.c': {
126+
'0x3E8u': 'CHAR_DEFAULT_TIMEOUT_MS',
127+
'0x1u': 'USART_SINGLE_BYTE_TRANSFER',
128+
},
129+
}
130+
131+
132+
def is_identifier_char(c):
133+
"""Check if character can be part of an identifier."""
134+
return c.isalnum() or c == '_'
135+
136+
137+
def should_skip_file(filepath):
138+
"""Determine if a file should be skipped."""
139+
filename = os.path.basename(filepath)
140+
return filename in ['HeliOS.h', 'config.h']
141+
142+
143+
def replace_in_line(line, filename):
144+
"""
145+
Replace magic numbers with defined constants in a line.
146+
Only replaces literals, not parts of identifiers or hex numbers.
147+
"""
148+
replacements_for_file = CONTEXT_SENSITIVE_REPLACEMENTS.get(filename, {})
149+
150+
result = []
151+
i = 0
152+
in_string = False
153+
in_char = False
154+
escape_next = False
155+
156+
while i < len(line):
157+
if escape_next:
158+
result.append(line[i])
159+
escape_next = False
160+
i += 1
161+
continue
162+
163+
char = line[i]
164+
165+
if char == '\\':
166+
escape_next = True
167+
result.append(char)
168+
i += 1
169+
continue
170+
171+
if char == '"' and not in_char:
172+
in_string = not in_string
173+
result.append(char)
174+
i += 1
175+
continue
176+
177+
if char == "'" and not in_string:
178+
in_char = not in_char
179+
result.append(char)
180+
i += 1
181+
continue
182+
183+
if in_string or in_char:
184+
result.append(char)
185+
i += 1
186+
continue
187+
188+
if len(result) > 0 and is_identifier_char(result[-1]):
189+
result.append(char)
190+
i += 1
191+
continue
192+
193+
if char == '0' and i + 1 < len(line) and line[i+1] in 'xX':
194+
hex_start = i
195+
i += 2
196+
while i < len(line) and (line[i] in '0123456789ABCDEFabcdef' or line[i] in 'uUlL'):
197+
i += 1
198+
199+
next_char = line[i] if i < len(line) else ''
200+
if is_identifier_char(next_char):
201+
result.append(line[hex_start:i])
202+
continue
203+
204+
hex_literal = line[hex_start:i]
205+
206+
replacement = replacements_for_file.get(hex_literal)
207+
if replacement:
208+
result.append(replacement)
209+
else:
210+
result.append(hex_literal)
211+
continue
212+
213+
result.append(char)
214+
i += 1
215+
216+
return ''.join(result)
217+
218+
219+
def process_file(filepath):
220+
"""Process a single file and replace magic numbers."""
221+
filename = os.path.basename(filepath)
222+
223+
try:
224+
with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:
225+
lines = f.readlines()
226+
227+
modified = False
228+
new_lines = []
229+
230+
for line in lines:
231+
original = line.rstrip('\n')
232+
processed_line = replace_in_line(original, filename)
233+
new_lines.append(processed_line + '\n' if line.endswith('\n') else processed_line)
234+
235+
if processed_line != original:
236+
modified = True
237+
238+
if modified:
239+
with open(filepath, 'w', encoding='utf-8') as f:
240+
f.writelines(new_lines)
241+
return True
242+
243+
return False
244+
245+
except Exception as e:
246+
print(f"Error processing {filepath}: {e}")
247+
return False
248+
249+
250+
def process_directory(directory):
251+
"""Process all C source files in the directory."""
252+
directory = Path(directory)
253+
254+
if not directory.exists():
255+
print(f"Warning: Directory {directory} does not exist")
256+
return 0, 0
257+
258+
processed_count = 0
259+
skipped_count = 0
260+
261+
for root, dirs, files in os.walk(directory):
262+
for filename in files:
263+
if not filename.endswith('.c'):
264+
continue
265+
266+
filepath = os.path.join(root, filename)
267+
268+
if should_skip_file(filepath):
269+
print(f"Skipping: {filepath}")
270+
skipped_count += 1
271+
continue
272+
273+
if process_file(filepath):
274+
print(f"Modified: {filepath}")
275+
processed_count += 1
276+
else:
277+
print(f"No changes: {filepath}")
278+
279+
return processed_count, skipped_count
280+
281+
282+
def main():
283+
"""Main entry point."""
284+
print("Replacing magic numbers with defined constants...")
285+
print("=" * 60)
286+
287+
total_processed = 0
288+
total_skipped = 0
289+
290+
for directory in ['src', 'drivers']:
291+
print(f"\nProcessing {directory}/ directory:")
292+
print("-" * 60)
293+
processed, skipped = process_directory(directory)
294+
total_processed += processed
295+
total_skipped += skipped
296+
297+
print("\n" + "=" * 60)
298+
print(f"Summary: {total_processed} files modified, {total_skipped} files skipped")
299+
300+
301+
if __name__ == '__main__':
302+
main()

0 commit comments

Comments
 (0)