123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- '''
- config.py - Helper functions for config manipulation
- '''
- import re
- FILES = ('Marlin/Configuration.h', 'Marlin/Configuration_adv.h')
- def set(file_path, define_name, value):
- '''
- Replaces a define in a file with a new value.
- Returns True if the define was found and replaced, False otherwise.
- '''
- # Read the contents of the file
- with open(file_path, 'r') as f:
- content = f.readlines()
- modified = False
- for i in range(len(content)):
- # Regex to match the desired pattern
- match = re.match(r'^(\s*)(/*)(\s*)(#define\s+{})\s+(.*)$'.format(re.escape(define_name)), content[i])
- if match:
- new_line = f"{match[1]}{match[3]}{match[4]} {value} // {match[5]}\n"
- content[i] = new_line
- modified = True
- # Write the modified content back to the file only if changes were made
- if modified:
- with open(file_path, 'w') as f:
- f.writelines(content)
- return True
- return False
- def add(file_path, define_name, value=""):
- '''
- Insert a define on the first blank line in a file.
- Returns True if the define was found and replaced, False otherwise.
- '''
- with open(file_path, 'r') as f:
- content = f.readlines()
- # Prepend a space to the value if it's not empty
- if value != "":
- value = " " + value
- # Find the first blank line to insert the new define
- for i in range(len(content)):
- if content[i].strip() == '':
- # Insert the define at the first blank line
- content.insert(i, f"#define {define_name}{value}\n")
- break
- else:
- # If no blank line is found, append to the end
- content.append(f"#define {define_name}{value}\n")
- with open(file_path, 'w') as f:
- f.writelines(content)
- def enable(file_path, define_name, enable=True):
- '''
- Uncomment or comment the named defines in the given file path.
- Returns True if the define was found, False otherwise.
- '''
- # Read the contents of the file
- with open(file_path, 'r') as f:
- content = f.readlines()
- # Prepare the regex
- regex = re.compile(r'^(\s*)(/*)(\s*)(#define\s+{}\b.*?)( *//.*)?$'.format(re.escape(define_name)))
- # Find the define in the file and uncomment or comment it
- found = False
- modified = False
- for i in range(len(content)):
- match = regex.match(content[i])
- if not match: continue
- found = True
- if enable:
- if match[2]:
- modified = True
- comment = '' if match[5] is None else ' ' + match[5]
- content[i] = f"{match[1]}{match[3]}{match[4]}{comment}\n"
- else:
- if not match[2]:
- modified = True
- comment = '' if match[5] is None else match[5]
- if comment.startswith(' '): comment = comment[2:]
- content[i] = f"{match[1]}//{match[3]}{match[4]}{comment}\n"
- break
- # Write the modified content back to the file only if changes were made
- if modified:
- with open(file_path, 'w') as f:
- f.writelines(content)
- return found
|