---- arm-asm.c ---- ---- arm-gen.c ---- ---- arm-link.c ---- ---- arm64-gen.c ---- ---- arm64-link.c ---- ---- c67-gen.c ---- ---- c67-link.c ---- ---- conftest.c ---- ---- i386-asm.c ---- 209c209 < 0x0f, /* g */ --- > 0x0f /* g */ 238c238 < { 0, }, --- > { 0 } 252a253,254 > /* last operation */ > 0 1576,1578d1577 < default: < reg = TOK_ASM_eax + reg; < break; 1583a1583,1585 > default: > reg = TOK_ASM_eax + reg; > break; ---- i386-gen.c ---- ---- i386-link.c ---- ---- il-gen.c ---- ---- libtcc.c ---- 27c27 < ST_DATA int gnu_ext = 1; --- > //ST_DATA int gnu_ext = 1; 30c30 < ST_DATA int tcc_ext = 1; --- > //ST_DATA int tcc_ext = 1; 33c33 < ST_DATA struct TCCState *tcc_state; --- > //ST_DATA struct TCCState *tcc_state; 820c820 < # if defined(__linux__) --- > //# if defined(__linux__) 823c823 < # endif --- > //# endif 1177c1177 < ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, --- > ELF64_ST_INFO(STB_GLOBAL, STT_NOTYPE), 0, 1552c1552 < { NULL, 0, 0 }, --- > { NULL, 0, 0 } 1555c1555 < static const FlagDef options_W[] = { --- > static FlagDef options_W[] = { 1557,1562c1557,1561 < { offsetof(TCCState, warn_unsupported), 0, "unsupported" }, < { offsetof(TCCState, warn_write_strings), 0, "write-strings" }, < { offsetof(TCCState, warn_error), 0, "error" }, < { offsetof(TCCState, warn_gcc_compat), 0, "gcc-compat" }, < { offsetof(TCCState, warn_implicit_function_declaration), WD_ALL, < "implicit-function-declaration" }, --- > { 0, 0, "unsupported" }, > { 0, 0, "write-strings" }, > { 0, 0, "error" }, > { 0, 0, "gcc-compat" }, > { 0, WD_ALL, "implicit-function-declaration" }, 1566,1572c1565,1571 < static const FlagDef options_f[] = { < { offsetof(TCCState, char_is_unsigned), 0, "unsigned-char" }, < { offsetof(TCCState, char_is_unsigned), FD_INVERT, "signed-char" }, < { offsetof(TCCState, nocommon), FD_INVERT, "common" }, < { offsetof(TCCState, leading_underscore), 0, "leading-underscore" }, < { offsetof(TCCState, ms_extensions), 0, "ms-extensions" }, < { offsetof(TCCState, dollars_in_identifiers), 0, "dollars-in-identifiers" }, --- > static FlagDef options_f[] = { > { 0, 0, "unsigned-char" }, > { 0, FD_INVERT, "signed-char" }, > { 0, FD_INVERT, "common" }, > { 0, 0, "leading-underscore" }, > { 0, 0, "ms-extensions" }, > { 0, 0, "dollars-in-identifiers" }, 1576,1577c1575,1576 < static const FlagDef options_m[] = { < { offsetof(TCCState, ms_bitfields), 0, "ms-bitfields" }, --- > static FlagDef options_m[] = { > { 0, 0, "ms-bitfields" }, 1579c1578 < { offsetof(TCCState, nosse), FD_INVERT, "sse" }, --- > { 0, FD_INVERT, "sse" }, 1582a1582,1599 > > void _init_options(void) { > options_W[1].offset = offsetof(TCCState, warn_unsupported); > options_W[2].offset = offsetof(TCCState, warn_write_strings); > options_W[3].offset = offsetof(TCCState, warn_error); > options_W[4].offset = offsetof(TCCState, warn_gcc_compat); > options_W[5].offset = offsetof(TCCState, warn_implicit_function_declaration); > options_f[0].offset = offsetof(TCCState, char_is_unsigned); > options_f[1].offset = offsetof(TCCState, char_is_unsigned); > options_f[2].offset = offsetof(TCCState, nocommon); > options_f[3].offset = offsetof(TCCState, leading_underscore); > options_f[4].offset = offsetof(TCCState, ms_extensions); > options_f[5].offset = offsetof(TCCState, dollars_in_identifiers); > options_m[0].offset = offsetof(TCCState, ms_bitfields); > #ifdef TCC_TARGET_X86_64 > options_m[1].offset = offsetof(TCCState, nosse); > #endif > } ---- tcc.c ---- 239c239 < #else --- > #elif 0 242a243,244 > #else > return 0; 254c256 < --- > _init_options(); ---- tccasm.c ---- 222d221 < default: 223a223 > default: 251d250 < default: 252a252 > default: ---- tcccoff.c ---- ---- tccelf.c ---- 28a29 > #if 0 43a45 > #endif 171,172c173,174 < && ELFW(ST_BIND)(sym->st_info) == STB_LOCAL) < sym->st_info = ELFW(ST_INFO)(STB_GLOBAL, ELFW(ST_TYPE)(sym->st_info)); --- > && ELF64_ST_BIND(sym->st_info) == STB_LOCAL) > sym->st_info = ELF64_ST_INFO(STB_GLOBAL, ELF64_ST_TYPE(sym->st_info)); 183c185 < int n = ELFW(R_SYM)(rel->r_info) - first_sym; --- > int n = ELF64_R_SYM(rel->r_info) - first_sym; 185c187 < rel->r_info = ELFW(R_INFO)(tr[n], ELFW(R_TYPE)(rel->r_info)); --- > rel->r_info = ELF64_R_INFO(tr[n], ELF64_R_TYPE(rel->r_info)); 375c377 < if (ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) { --- > if (ELF64_ST_BIND(sym->st_info) != STB_LOCAL) { 415c417 < if (ELFW(ST_BIND)(info) != STB_LOCAL) { --- > if (ELF64_ST_BIND(info) != STB_LOCAL) { 497,499c499,501 < sym_bind = ELFW(ST_BIND)(info); < sym_type = ELFW(ST_TYPE)(info); < sym_vis = ELFW(ST_VISIBILITY)(other); --- > sym_bind = ELF64_ST_BIND(info); > sym_type = ELF64_ST_TYPE(info); > sym_vis = ELF64_ST_VISIBILITY(other); 511c513 < esym_bind = ELFW(ST_BIND)(esym->st_info); --- > esym_bind = ELF64_ST_BIND(esym->st_info); 514c516 < esym_vis = ELFW(ST_VISIBILITY)(esym->st_other); --- > esym_vis = ELF64_ST_VISIBILITY(esym->st_other); 522c524 < esym->st_other = (esym->st_other & ~ELFW(ST_VISIBILITY)(-1)) --- > esym->st_other = (esym->st_other & ~ELF64_ST_VISIBILITY(-1)) 560c562 < esym->st_info = ELFW(ST_INFO)(sym_bind, sym_type); --- > esym->st_info = ELF64_ST_INFO(sym_bind, sym_type); 570c572 < ELFW(ST_INFO)(sym_bind, sym_type), other, --- > ELF64_ST_INFO(sym_bind, sym_type), other, 598c600 < rel->r_info = ELFW(R_INFO)(symbol, type); --- > rel->r_info = ELF64_R_INFO(symbol, type); 737c739 < if (ELFW(ST_BIND)(p->st_info) == STB_LOCAL) { --- > if (ELF64_ST_BIND(p->st_info) == STB_LOCAL) { 750c752 < if (ELFW(ST_BIND)(p->st_info) != STB_LOCAL) { --- > if (ELF64_ST_BIND(p->st_info) != STB_LOCAL) { 766,767c768,769 < sym_index = ELFW(R_SYM)(rel->r_info); < type = ELFW(R_TYPE)(rel->r_info); --- > sym_index = ELF64_R_SYM(rel->r_info); > type = ELF64_R_TYPE(rel->r_info); 769c771 < rel->r_info = ELFW(R_INFO)(sym_index, type); --- > rel->r_info = ELF64_R_INFO(sym_index, type); 810c812 < sym_bind = ELFW(ST_BIND)(sym->st_info); --- > sym_bind = ELF64_ST_BIND(sym->st_info); 838c840 < sym_index = ELFW(R_SYM)(rel->r_info); --- > sym_index = ELF64_R_SYM(rel->r_info); 840c842 < type = ELFW(R_TYPE)(rel->r_info); --- > type = ELF64_R_TYPE(rel->r_info); 873,874c875,876 < sym_index = ELFW(R_SYM)(rel->r_info); < type = ELFW(R_TYPE)(rel->r_info); --- > sym_index = ELF64_R_SYM(rel->r_info); > type = ELF64_R_TYPE(rel->r_info); 881c883 < rel->r_info = ELFW(R_INFO)(sym_index, R_386_RELATIVE); --- > rel->r_info = ELF64_R_INFO(sym_index, R_386_RELATIVE); 916c918 < set_elf_sym(symtab_section, 0, 4, ELFW(ST_INFO)(STB_GLOBAL, STT_OBJECT), --- > set_elf_sym(symtab_section, 0, 4, ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT), 963c965 < if (ELFW(ST_BIND)(sym->st_info) == STB_LOCAL) { --- > if (ELF64_ST_BIND(sym->st_info) == STB_LOCAL) { 1008c1010 < ELFW(ST_INFO)(STB_GLOBAL, STT_FUNC), 0, s1->plt->sh_num, plt_name); --- > ELF64_ST_INFO(STB_GLOBAL, STT_FUNC), 0, s1->plt->sh_num, plt_name); 1034c1036 < type = ELFW(R_TYPE)(rel->r_info); --- > type = ELF64_R_TYPE(rel->r_info); 1036c1038 < sym_index = ELFW(R_SYM)(rel->r_info); --- > sym_index = ELF64_R_SYM(rel->r_info); 1068,1070c1070,1072 < && (ELFW(ST_TYPE)(esym->st_info) == STT_FUNC < || (ELFW(ST_TYPE)(esym->st_info) == STT_NOTYPE < && ELFW(ST_TYPE)(sym->st_info) == STT_FUNC))) --- > && (ELF64_ST_TYPE(esym->st_info) == STT_FUNC > || (ELF64_ST_TYPE(esym->st_info) == STT_NOTYPE > && ELF64_ST_TYPE(sym->st_info) == STT_FUNC))) 1083,1085c1085,1087 < (ELFW(ST_VISIBILITY)(sym->st_other) != STV_DEFAULT || < ELFW(ST_BIND)(sym->st_info) == STB_LOCAL)) { < rel->r_info = ELFW(R_INFO)(sym_index, R_X86_64_PC32); --- > (ELF64_ST_VISIBILITY(sym->st_other) != STV_DEFAULT || > ELF64_ST_BIND(sym->st_info) == STB_LOCAL)) { > rel->r_info = ELF64_R_INFO(sym_index, R_X86_64_PC32); 1105c1107 < rel->r_info = ELFW(R_INFO)(attr->plt_sym, type); --- > rel->r_info = ELF64_R_INFO(attr->plt_sym, type); 1140c1142 < ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, --- > ELF64_ST_INFO(STB_GLOBAL, STT_NOTYPE), 0, 1144c1146 < ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, --- > ELF64_ST_INFO(STB_GLOBAL, STT_NOTYPE), 0, 1168c1170 < ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, --- > ELF64_ST_INFO(STB_GLOBAL, STT_NOTYPE), 0, 1172c1174 < ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, --- > ELF64_ST_INFO(STB_GLOBAL, STT_NOTYPE), 0, 1221c1223 < ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, --- > ELF64_ST_INFO(STB_GLOBAL, STT_NOTYPE), 0, 1225c1227 < ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, --- > ELF64_ST_INFO(STB_GLOBAL, STT_NOTYPE), 0, 1229c1231 < ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, --- > ELF64_ST_INFO(STB_GLOBAL, STT_NOTYPE), 0, 1260c1262 < ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, --- > ELF64_ST_INFO(STB_GLOBAL, STT_NOTYPE), 0, 1265c1267 < ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, --- > ELF64_ST_INFO(STB_GLOBAL, STT_NOTYPE), 0, 1314c1316 < int sym_index = ELFW(R_SYM) (rel->r_info); --- > int sym_index = ELF64_R_SYM (rel->r_info); 1344c1346 < switch (ELFW(R_TYPE) (rel->r_info)) { --- > switch (ELF64_R_TYPE (rel->r_info)) { 1363,1364c1365,1366 < if (ELFW(R_TYPE)(rel->r_info) == R_RELATIVE) { < int sym_index = ELFW(R_SYM) (rel->r_info); --- > if (ELF64_R_TYPE(rel->r_info) == R_RELATIVE) { > int sym_index = ELF64_R_SYM (rel->r_info); 1370c1372 < rel->r_info = ELFW(R_INFO)(0, R_RELATIVE); --- > rel->r_info = ELF64_R_INFO(0, R_RELATIVE); 1400c1402 < type = ELFW(ST_TYPE)(esym->st_info); --- > type = ELF64_ST_TYPE(esym->st_info); 1411c1413 < ELFW(ST_INFO)(STB_GLOBAL,STT_FUNC), 0, 0, --- > ELF64_ST_INFO(STB_GLOBAL,STT_FUNC), 0, 0, 1428c1430 < if (ELFW(ST_BIND)(esym->st_info) == STB_WEAK) { --- > if (ELF64_ST_BIND(esym->st_info) == STB_WEAK) { 1431c1433 < && (ELFW(ST_BIND)(dynsym->st_info) == STB_GLOBAL)) { --- > && (ELF64_ST_BIND(dynsym->st_info) == STB_GLOBAL)) { 1450c1452 < if (ELFW(ST_BIND)(sym->st_info) == STB_WEAK || --- > if (ELF64_ST_BIND(sym->st_info) == STB_WEAK || 1456c1458 < } else if (s1->rdynamic && ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) { --- > } else if (s1->rdynamic && ELF64_ST_BIND(sym->st_info) != STB_LOCAL) { 1481c1483 < && ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) { --- > && ELF64_ST_BIND(sym->st_info) != STB_LOCAL) { 1486c1488 < if (ELFW(ST_BIND)(esym->st_info) != STB_WEAK) --- > if (ELF64_ST_BIND(esym->st_info) != STB_WEAK) 1503c1505 < if (ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) { --- > if (ELF64_ST_BIND(sym->st_info) != STB_LOCAL) { 1909,1913d1910 < default: < case TCC_OUTPUT_EXE: < ehdr.e_type = ET_EXEC; < ehdr.e_entry = get_elf_sym_addr(s1, "_start", 1); < break; 1920a1918,1922 > case TCC_OUTPUT_EXE: > default: > ehdr.e_type = ET_EXEC; > ehdr.e_entry = get_elf_sym_addr(s1, "_start", 1); > break; 2481c2483 < if (ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) { --- > if (ELF64_ST_BIND(sym->st_info) != STB_LOCAL) { 2520,2521c2522,2523 < type = ELFW(R_TYPE)(rel->r_info); < sym_index = ELFW(R_SYM)(rel->r_info); --- > type = ELF64_R_TYPE(rel->r_info); > sym_index = ELF64_R_SYM(rel->r_info); 2537c2539 < rel->r_info = ELFW(R_INFO)(sym_index, type); --- > rel->r_info = ELF64_R_INFO(sym_index, type); 2766c2768 < sym_bind = ELFW(ST_BIND)(sym->st_info); --- > sym_bind = ELF64_ST_BIND(sym->st_info); ---- tccgen.c ---- 24a25,26 > #define NODATA_WANTED (nocode_wanted > 0) /* no static data output wanted either */ > #define STATIC_DATA_WANTED (nocode_wanted & 0xC0000000) /* only static data output */ 31c33,39 < ST_DATA int rsym, anon_sym, ind, loc; --- > static int local_scope; > static int in_sizeof; > static int section_sym; > > ST_DATA int vlas_in_scope; /* number of VLAs that are currently in scope */ > ST_DATA int vla_sp_root_loc; /* vla_sp_loc for SP before any VLAs were pushed */ > ST_DATA int vla_sp_loc; /* Pointer to variable holding location to store stack pointer on the stack when modifying stack pointer */ 32a41,42 > #if 0 > ST_DATA int rsym, anon_sym, ind, loc; 42,48d51 < static int local_scope; < static int in_sizeof; < static int section_sym; < < ST_DATA int vlas_in_scope; /* number of VLAs that are currently in scope */ < ST_DATA int vla_sp_root_loc; /* vla_sp_loc for SP before any VLAs were pushed */ < ST_DATA int vla_sp_loc; /* Pointer to variable holding location to store stack pointer on the stack when modifying stack pointer */ 54,55d56 < #define NODATA_WANTED (nocode_wanted > 0) /* no static data output wanted either */ < #define STATIC_DATA_WANTED (nocode_wanted & 0xC0000000) /* only static data output */ 63,64c64,66 < < ST_DATA CType char_pointer_type, func_old_type, int_type, size_type, ptrdiff_type; --- > ST_DATA CType char_pointer_type, func_old_type, int_type, size_type; > #endif > ST_DATA CType ptrdiff_type; 161c163 < ELFW(ST_INFO)(STB_LOCAL, STT_SECTION), 0, --- > ELF64_ST_INFO(STB_LOCAL, STT_SECTION), 0, 179c181 < ELFW(ST_INFO)(STB_LOCAL, STT_FILE), 0, --- > ELF64_ST_INFO(STB_LOCAL, STT_FILE), 0, 302c304 < esym->st_other = (esym->st_other & ~ELFW(ST_VISIBILITY)(-1)) --- > esym->st_other = (esym->st_other & ~ELF64_ST_VISIBILITY(-1)) 311c313 < old_sym_bind = ELFW(ST_BIND)(esym->st_info); --- > old_sym_bind = ELF64_ST_BIND(esym->st_info); 313c315 < esym->st_info = ELFW(ST_INFO)(sym_bind, ELFW(ST_TYPE)(esym->st_info)); --- > esym->st_info = ELF64_ST_INFO(sym_bind, ELF64_ST_TYPE(esym->st_info)); 410c412 < info = ELFW(ST_INFO)(sym_bind, sym_type); --- > info = ELF64_ST_INFO(sym_bind, sym_type); 1904d1905 < default: l1 = gen_opic_sdiv(l1, l2); break; 1907a1909 > default: l1 = gen_opic_sdiv(l1, l2); break; 2458a2461,2470 > static long double negate_ld(long double d) { > #if LDBL_MANT_DIG == 64 > register unsigned long long *p = (unsigned long long *)&d; > p[1] ^= 1ul<<15; > return *(long double *)p; > #else > return -d; > #endif > } > 2500c2512 < vtop->c.ld = -(long double)-vtop->c.i; --- > vtop->c.ld = negate_ld((long double)-vtop->c.i); 2505c2517 < vtop->c.ld = -(long double)-(uint32_t)vtop->c.i; --- > vtop->c.ld = negate_ld((long double)-(uint32_t)vtop->c.i); 6517,6518c6529,6530 < ELFW(R_TYPE)(rel->r_info), < ELFW(R_SYM)(rel->r_info), --- > ELF64_R_TYPE(rel->r_info), > ELF64_R_SYM(rel->r_info), ---- tccpe.c ---- ---- tccpp.c ---- 25a26 > #if 0 39a41 > #endif 62c64 < #define DEF(id, str) str "\0" --- > #define DEF(id, str) str "\n" 1506c1508 < if (varg < TOK_IDENT) --- > if (varg < TOK_IDENT) { 1508a1511 > } 1554c1557 < if (3 == spc) --- > if (3 == spc) { 1556a1560 > } 3671c3675 < if (c == '\0') --- > if (c == '\n') ---- tccrun.c ---- ---- tcctools.c ---- ---- x86_64-gen.c ---- 111,141d110 < ST_DATA const int reg_classes[NB_REGS] = { < /* eax */ RC_INT | RC_RAX, < /* ecx */ RC_INT | RC_RCX, < /* edx */ RC_INT | RC_RDX, < 0, < 0, < 0, < 0, < 0, < RC_R8, < RC_R9, < RC_R10, < RC_R11, < 0, < 0, < 0, < 0, < /* xmm0 */ RC_FLOAT | RC_XMM0, < /* xmm1 */ RC_FLOAT | RC_XMM1, < /* xmm2 */ RC_FLOAT | RC_XMM2, < /* xmm3 */ RC_FLOAT | RC_XMM3, < /* xmm4 */ RC_FLOAT | RC_XMM4, < /* xmm5 */ RC_FLOAT | RC_XMM5, < /* xmm6 an xmm7 are included so gv() can be used on them, < but they are not tagged with RC_FLOAT because they are < callee saved on Windows */ < RC_XMM6, < RC_XMM7, < /* st0 */ RC_ST0 < }; < 633c602 < greloca(cur_text_section, vtop->sym, ind + 1, R_X86_64_PLT32, (int)(vtop->c.i-4)); --- > greloca(cur_text_section, vtop->sym, ind + 1, R_X86_64_PC32, (int)(vtop->c.i-4)); // tcc's PLT code doesn't seem to work with static builds 1194a1164,1166 > enum __va_arg_type { > __va_gen_reg, __va_float_reg, __va_stack > }; 1198,1200d1169 < enum __va_arg_type { < __va_gen_reg, __va_float_reg, __va_stack < }; 1204d1172 < default: return __va_stack; 1206a1175 > default: return __va_stack; 1244c1213 < char _onstack[nb_args], *onstack = _onstack; --- > char _onstack[/*nb_args*/1000/*fucking vlas*/], *onstack = _onstack; 1461,1465d1429 < default: < stack_arg: < seen_stack_size = ((seen_stack_size + align - 1) & -align) + size; < break; < 1476a1441,1445 > default: > stack_arg: > seen_stack_size = ((seen_stack_size + align - 1) & -align) + size; > break; > 1940,1943d1908 < default: < case '+': < a = 0; < break; 1956a1922,1925 > case '+': > default: > a = 0; > break; 2016,2019d1984 < default: < case '+': < a = 0; < break; 2027a1993,1996 > break; > case '+': > default: > a = 0; ---- x86_64-link.c ---- 177c177 < sym_index = ELFW(R_SYM)(rel->r_info); --- > sym_index = ELF64_R_SYM(rel->r_info); 185c185 < qrel->r_info = ELFW(R_INFO)(esym_index, R_X86_64_64); --- > qrel->r_info = ELF64_R_INFO(esym_index, R_X86_64_64); 190c190 < qrel->r_info = ELFW(R_INFO)(0, R_X86_64_RELATIVE); --- > qrel->r_info = ELF64_R_INFO(0, R_X86_64_RELATIVE); 202c202 < qrel->r_info = ELFW(R_INFO)(0, R_X86_64_RELATIVE); --- > qrel->r_info = ELF64_R_INFO(0, R_X86_64_RELATIVE); 216c216 < qrel->r_info = ELFW(R_INFO)(esym_index, R_X86_64_PC32); --- > qrel->r_info = ELF64_R_INFO(esym_index, R_X86_64_PC32); 249c249 < qrel->r_info = ELFW(R_INFO)(esym_index, R_X86_64_PC64); --- > qrel->r_info = ELF64_R_INFO(esym_index, R_X86_64_PC64); ---- lib/armeabi.c ---- ---- lib/armflush.c ---- ---- lib/bcheck.c ---- ---- lib/lib-arm64.c ---- ---- lib/libtcc1.c ---- 615a616,622 > > static long double negate_ld(long double d) { > register unsigned long long *p = (unsigned long long *)&d; > p[1] ^= 1ul<<15; > return *(long double *)p; > } > 619c626 < ret = __fixunsxfdi((s = a1 >= 0) ? a1 : -a1); --- > ret = __fixunsxfdi((s = a1 >= 0) ? a1 : negate_ld(a1)); ---- lib/va_list.c ----