| 147 | |
| 148 | |
| 149 | class CFunction: |
| 150 | def __init__(self, name: str) -> None: |
| 151 | self.name = name |
| 152 | self.params: List[str] = [] |
| 153 | self.body: List[str] = [] |
| 154 | self.va_start: List[str] = [] |
| 155 | self.va_end: List[str] = [] |
| 156 | |
| 157 | def add_param(self, type: str, pname: str) -> None: |
| 158 | self.params.append('{} {}'.format(type, pname)) |
| 159 | |
| 160 | def add_statement(self, stmt: str) -> None: |
| 161 | self.body.append(stmt) |
| 162 | |
| 163 | def add_vlist(self, name: str) -> None: |
| 164 | last_param = self.params[-1].split()[-1] |
| 165 | self.va_start = [ |
| 166 | 'va_list {};'.format(name), |
| 167 | 'va_start({}, {});'.format(name, last_param) |
| 168 | ] |
| 169 | self.va_end = ['va_end({});'.format(name)] |
| 170 | self.add_param('...', '') |
| 171 | |
| 172 | def substitute(self, form: Template, **kwargs) -> str: |
| 173 | return form.substitute(error_type=error_type, |
| 174 | try_wrap=try_wrap, |
| 175 | name=self.name, |
| 176 | params=', '.join(self.params), |
| 177 | body=";\n ".join(self.body), |
| 178 | va_start="\n ".join(self.va_start), |
| 179 | va_end="\n ".join(self.va_end), |
| 180 | **kwargs) |
| 181 | |
| 182 | def generate_header(self) -> str: |
| 183 | return self.substitute(header_function, export_c_macro=export_c_macro) |
| 184 | |
| 185 | def generate_function_pointer(self, name: Optional[str] = None) -> str: |
| 186 | return self.substitute(function_pointer_typedef, |
| 187 | fname=name or self.name) |
| 188 | |
| 189 | def generate_body(self) -> str: |
| 190 | return self.substitute(c_api_impl) |
| 191 | |
| 192 | |
| 193 | class BadParam: |