From 17560c1a41945375f6dcc64453b76599191ebf92 Mon Sep 17 00:00:00 2001 From: Serge Vakulenko Date: Thu, 30 Aug 2018 22:10:55 -0700 Subject: [PATCH] Parse grouplists. --- examples/md-uv380-empty.conf | 17 +- examples/md-uv380-factory.conf | 17 +- examples/md-uv380_bm_2018-08-07.conf | 147 +++++++++--------- examples/md2017-7-23-2017.conf | 75 ++++----- .../md2017-DualHotspot-PNW-2017-07-19.conf | 25 +-- examples/md380-baynet-full-codeplug-rev1.conf | 93 +++++------ .../md380-generic-norcal-uhf-20161103b.conf | 97 ++++++------ examples/md380-norcal-brandmeister.conf | 95 +++++------ md380.c | 108 ++++++++++++- uv380.c | 112 ++++++++++++- 10 files changed, 499 insertions(+), 287 deletions(-) diff --git a/examples/md-uv380-empty.conf b/examples/md-uv380-empty.conf index 530c940..f650701 100644 --- a/examples/md-uv380-empty.conf +++ b/examples/md-uv380-empty.conf @@ -1,6 +1,6 @@ # # This configuration was generated 2018/08/30 by dmrconfig, -# Version 0.1.37, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# Version 0.1.40, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-UV380 Name: - @@ -41,32 +41,33 @@ Zone Name Channels 1b - - # Table of scan lists. -# 1) Zone number: 1-250 +# 1) Scan list number: 1-250 # 2) Name: up to 16 characters, use '_' instead of space # 3) Priority channel 1 (50% of scans): -, Sel or index # 4) Priority channel 2 (25% of scans): -, Sel or index -# 5) Designated transmit channel: -, Last or index +# 5) Designated transmit channel: Last, Sel or index # 6) List of channels: numbers and ranges (N-M) separated by comma # Scanlist Name PCh1 PCh2 TxCh Channels - 1 ScanList1 - - - 1 + 1 ScanList1 - - Last 1 # Table of contacts. # 1) Contact number: 1-10000 # 2) Name: up to 16 characters, use '_' instead of space # 3) Call type: Group, Private, All # 4) Call ID: 1...16777215 -# 5) Call receive tone: -, Yes +# 5) Call receive tone: -, + # Contact Name Type ID RxTone 1 Contact1 Group 1 - # Table of group lists. # 1) Group list number: 1-250 -# 2) List of contacts: numbers and ranges (N-M) separated by comma +# 2) Name: up to 16 characters, use '_' instead of space +# 3) List of contacts: numbers and ranges (N-M) separated by comma # -Grouplist Contacts - 1 1 +Grouplist Name Contacts + 1 GroupList1 1 # Table of text messages. # 1) Message number: 1-50 diff --git a/examples/md-uv380-factory.conf b/examples/md-uv380-factory.conf index 970d574..3e86588 100644 --- a/examples/md-uv380-factory.conf +++ b/examples/md-uv380-factory.conf @@ -1,6 +1,6 @@ # # This configuration was generated 2018/08/30 by dmrconfig, -# Version 0.1.37, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# Version 0.1.40, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-UV380 Name: - @@ -70,32 +70,33 @@ Zone Name Channels 1b - 6-10 # Table of scan lists. -# 1) Zone number: 1-250 +# 1) Scan list number: 1-250 # 2) Name: up to 16 characters, use '_' instead of space # 3) Priority channel 1 (50% of scans): -, Sel or index # 4) Priority channel 2 (25% of scans): -, Sel or index -# 5) Designated transmit channel: -, Last or index +# 5) Designated transmit channel: Last, Sel or index # 6) List of channels: numbers and ranges (N-M) separated by comma # Scanlist Name PCh1 PCh2 TxCh Channels - 1 ScanList1 - - - 1 + 1 ScanList1 - - Last 1 # Table of contacts. # 1) Contact number: 1-10000 # 2) Name: up to 16 characters, use '_' instead of space # 3) Call type: Group, Private, All # 4) Call ID: 1...16777215 -# 5) Call receive tone: -, Yes +# 5) Call receive tone: -, + # Contact Name Type ID RxTone 1 Contact1 Group 1 - # Table of group lists. # 1) Group list number: 1-250 -# 2) List of contacts: numbers and ranges (N-M) separated by comma +# 2) Name: up to 16 characters, use '_' instead of space +# 3) List of contacts: numbers and ranges (N-M) separated by comma # -Grouplist Contacts - 1 1 +Grouplist Name Contacts + 1 GroupList1 1 # Table of text messages. # 1) Message number: 1-50 diff --git a/examples/md-uv380_bm_2018-08-07.conf b/examples/md-uv380_bm_2018-08-07.conf index 4fe49e7..0820534 100644 --- a/examples/md-uv380_bm_2018-08-07.conf +++ b/examples/md-uv380_bm_2018-08-07.conf @@ -1,6 +1,6 @@ # # This configuration was generated 2018/08/30 by dmrconfig, -# Version 0.1.37, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# Version 0.1.40, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-UV380 Name: Dit_Call @@ -1005,75 +1005,75 @@ Zone Name Channels 55b - - # Table of scan lists. -# 1) Zone number: 1-250 +# 1) Scan list number: 1-250 # 2) Name: up to 16 characters, use '_' instead of space # 3) Priority channel 1 (50% of scans): -, Sel or index # 4) Priority channel 2 (25% of scans): -, Sel or index -# 5) Designated transmit channel: -, Last or index +# 5) Designated transmit channel: Last, Sel or index # 6) List of channels: numbers and ranges (N-M) separated by comma # Scanlist Name PCh1 PCh2 TxCh Channels - 1 Favoritter 760 760 - 741,743 - 2 BM_Frederikshavn 760 760 - 641,643 - 3 BM_Aarhus 760 760 - 480,482 - 4 BM_Aarhus_V 760 760 - 500,502 - 5 BM_Yding 760 760 - 741,743 - 6 BM_Sunds 760 760 - 721,723 - 7 BM_Odense 760 760 - 681,683 - 8 BM_Chrfeld 760 760 - 520,522 - 9 BM_Dronningmolle 760 760 - 540,542 - 10 BM_Helsingoer 760 760 - 580,582 - 11 BM_Humlebaek 760 760 - 621,623 - 12 BM_Gorlose 760 760 - 560,562 - 13 BM_Herlev 760 760 - 601,603 - 14 BM_Regnemark 760 760 - 701,703 - 15 BM_Mogenstrup 760 760 - 661,663 - 16 Frederikhavn 760 760 - 142,144 - 17 Vodskov 268 760 - 452,454 - 18 Stoevring 760 760 - 325,327 - 19 Thyholm 760 760 - 353,355 - 20 Viborg 760 760 - 410,412 - 21 Grenaa 760 760 - 170,172 - 22 Risskov 760 760 - 255,257 - 23 Torphoj 760 760 - 368,370 - 24 Fredericia 760 760 - 128,130 - 25 Esbjerg_N 760 760 - 86,88 - 26 Esbjerg 760 760 - 100,102 - 27 Vissenbjerg 760 760 - 438,440 - 28 Svendborg 760 760 - 339,341 - 29 Toender 760 760 - 382,384 - 30 Vejby 760 760 - 396,398 - 31 Helsingor 760 760 - 184,186 - 32 Frederikssund 760 760 - 156,158 - 33 Farum 760 760 - 114,116 - 34 CPH_F. 760 760 - 58,60 - 35 Roedovre 760 760 - 269,271 - 36 CPH_City 760 760 - 44,46 - 37 Hoejby 760 760 - 198,200 - 38 Vig 760 760 - 424,426 - 39 Bregninge 760 760 - 30,32 - 40 Snertinge 760 760 - 311,313 - 41 Regstrup 760 760 - 241,243 - 42 Ebberup 760 760 - 72,74 - 43 Borup 760 760 - 16,18 - 44 Slagelse 760 760 - 297,299 - 45 Naestved 760 760 - 227,229 - 46 Raadegaard 760 760 - 283,285 - 47 Vordingborg 760 760 - 466,468 - 48 Bandholm 760 760 - 1,3 - 49 Nakskov 760 760 - 212,214 - 50 FM_Nordjylland 760 760 - 367,793-795,797-800 - 51 FM_Midtjylland 760 760 - 214,801-804,807-808,810-811 - 52 FM_Syddanmark 760 760 - 812-814,818-819 - 53 FM_Hovedstaden 760 760 - 600,820-822,824 - 54 FM_Sjaelland 760 760 - 15,806,827-831 + 1 Favoritter 760 760 Last 741,743 + 2 BM_Frederikshavn 760 760 Last 641,643 + 3 BM_Aarhus 760 760 Last 480,482 + 4 BM_Aarhus_V 760 760 Last 500,502 + 5 BM_Yding 760 760 Last 741,743 + 6 BM_Sunds 760 760 Last 721,723 + 7 BM_Odense 760 760 Last 681,683 + 8 BM_Chrfeld 760 760 Last 520,522 + 9 BM_Dronningmolle 760 760 Last 540,542 + 10 BM_Helsingoer 760 760 Last 580,582 + 11 BM_Humlebaek 760 760 Last 621,623 + 12 BM_Gorlose 760 760 Last 560,562 + 13 BM_Herlev 760 760 Last 601,603 + 14 BM_Regnemark 760 760 Last 701,703 + 15 BM_Mogenstrup 760 760 Last 661,663 + 16 Frederikhavn 760 760 Last 142,144 + 17 Vodskov 268 760 Last 452,454 + 18 Stoevring 760 760 Last 325,327 + 19 Thyholm 760 760 Last 353,355 + 20 Viborg 760 760 Last 410,412 + 21 Grenaa 760 760 Last 170,172 + 22 Risskov 760 760 Last 255,257 + 23 Torphoj 760 760 Last 368,370 + 24 Fredericia 760 760 Last 128,130 + 25 Esbjerg_N 760 760 Last 86,88 + 26 Esbjerg 760 760 Last 100,102 + 27 Vissenbjerg 760 760 Last 438,440 + 28 Svendborg 760 760 Last 339,341 + 29 Toender 760 760 Last 382,384 + 30 Vejby 760 760 Last 396,398 + 31 Helsingor 760 760 Last 184,186 + 32 Frederikssund 760 760 Last 156,158 + 33 Farum 760 760 Last 114,116 + 34 CPH_F. 760 760 Last 58,60 + 35 Roedovre 760 760 Last 269,271 + 36 CPH_City 760 760 Last 44,46 + 37 Hoejby 760 760 Last 198,200 + 38 Vig 760 760 Last 424,426 + 39 Bregninge 760 760 Last 30,32 + 40 Snertinge 760 760 Last 311,313 + 41 Regstrup 760 760 Last 241,243 + 42 Ebberup 760 760 Last 72,74 + 43 Borup 760 760 Last 16,18 + 44 Slagelse 760 760 Last 297,299 + 45 Naestved 760 760 Last 227,229 + 46 Raadegaard 760 760 Last 283,285 + 47 Vordingborg 760 760 Last 466,468 + 48 Bandholm 760 760 Last 1,3 + 49 Nakskov 760 760 Last 212,214 + 50 FM_Nordjylland 760 760 Last 367,793-795,797-800 + 51 FM_Midtjylland 760 760 Last 214,801-804,807-808,810-811 + 52 FM_Syddanmark 760 760 Last 812-814,818-819 + 53 FM_Hovedstaden 760 760 Last 600,820-822,824 + 54 FM_Sjaelland 760 760 Last 15,806,827-831 # Table of contacts. # 1) Contact number: 1-10000 # 2) Name: up to 16 characters, use '_' instead of space # 3) Call type: Group, Private, All # 4) Call ID: 1...16777215 -# 5) Call receive tone: -, Yes +# 5) Call receive tone: -, + # Contact Name Type ID RxTone 1 Unlink Group 4000 - @@ -1138,22 +1138,23 @@ Contact Name Type ID RxTone # Table of group lists. # 1) Group list number: 1-250 -# 2) List of contacts: numbers and ranges (N-M) separated by comma +# 2) Name: up to 16 characters, use '_' instead of space +# 3) List of contacts: numbers and ranges (N-M) separated by comma # -Grouplist Contacts - 1 17-19,24-27,30-34,49,51 - 2 19,35-41,59 - 3 21-22,34,48,51,54 - 4 19,35-47,59 - 5 17 - 6 18 - 7 20 - 8 19 - 9 33 - 10 34 - 11 48 - 12 51 - 13 19,21-22,34-48 +Grouplist Name Contacts + 1 DMR+_TS_1 17-19,24-27,30-34,49,51 + 2 DMR+_TS_2 19,35-41,59 + 3 BM_TS_1 21-22,34,48,51,54 + 4 BM_TS_2 19,35-47,59 + 5 001_Verden 17 + 6 002_Europa 18 + 7 027_Norden 20 + 8 009_Lokal_9 19 + 9 235_UK 33 + 10 238_Danmark 34 + 11 240_Sverige 48 + 12 262_Germany 51 + 13 HS_RX 19,21-22,34-48 # Table of text messages. # 1) Message number: 1-50 diff --git a/examples/md2017-7-23-2017.conf b/examples/md2017-7-23-2017.conf index 05b7ddb..a2712c0 100644 --- a/examples/md2017-7-23-2017.conf +++ b/examples/md2017-7-23-2017.conf @@ -1,6 +1,6 @@ # # This configuration was generated 2018/08/30 by dmrconfig, -# Version 0.1.37, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# Version 0.1.40, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-UV380 Name: - @@ -601,51 +601,51 @@ Zone Name Channels 32b - - # Table of scan lists. -# 1) Zone number: 1-250 +# 1) Scan list number: 1-250 # 2) Name: up to 16 characters, use '_' instead of space # 3) Priority channel 1 (50% of scans): -, Sel or index # 4) Priority channel 2 (25% of scans): -, Sel or index -# 5) Designated transmit channel: -, Last or index +# 5) Designated transmit channel: Last, Sel or index # 6) List of channels: numbers and ranges (N-M) separated by comma # Scanlist Name PCh1 PCh2 TxCh Channels - 1 Bullion-MtnWest_ 86 86 - 1-15 - 2 Meadow-MtnWest_U 86 86 - 17-32 - 3 DT-MtnWest_U 86 86 - 33-48 - 4 Bear-MtnWest_U 86 86 - 49-64 - 5 Park-MtnWest_U 86 86 - 65-80 - 6 BRidge-MtnWest_U 86 86 - 81-95 - 7 Rita-MtnWest_U Sel Sel - 97-112 - 8 RndMtn-MtnWest_U 136 136 - 113-128 - 9 SLO-MtnWest_U 136 136 - 129-144 - 10 HFD-MtnWest_U 175 175 - 145-160 - 11 SCruz-NorCal_U 175 175 - 161-175 - 12 SJ1-NorCal_U 190 190 - 176-190 - 13 SJ2-NorCal_U 311 311 - 191-204 - 14 SJ3-NorCal_U 311 311 - 206-220 - 15 FMT-NorCal_U 311 311 - 221-235 - 16 WLNTCRK-NorCal_U 311 311 - 236-250 - 17 SBruno-NorCal_U 311 311 - 251-265 - 18 Oakland-NorCal_U 311 311 - 266-280 - 19 Lvrmore-NorCal_U 311 311 - 281-295 - 20 Mt_Oso-NorCal_U 311 311 - 296-310 - 21 Salinas-NorCal_U 311 311 - 311-325 - 22 Pismo-NorCal_U 403 403 - 326-340 - 23 SMaria-NorCal_U 403 403 - 341-355 - 24 Rita-MtnWest_V 403 403 - 356-371 - 25 Park-MtnWest_V 403 403 - 372-387 - 26 Meadow-MtnWest_V 403 403 - 388-403 - 27 Bullion-NorCal_V - - - 404-418 - 28 Sonora-NorCal_V - - - 419-433 - 29 Diablo-NorCal_V - - - 434-448 - 30 Sac-NorCal_V - - - 449-463 + 1 Bullion-MtnWest_ 86 86 Last 1-15 + 2 Meadow-MtnWest_U 86 86 Last 17-32 + 3 DT-MtnWest_U 86 86 Last 33-48 + 4 Bear-MtnWest_U 86 86 Last 49-64 + 5 Park-MtnWest_U 86 86 Last 65-80 + 6 BRidge-MtnWest_U 86 86 Last 81-95 + 7 Rita-MtnWest_U Sel Sel Last 97-112 + 8 RndMtn-MtnWest_U 136 136 Last 113-128 + 9 SLO-MtnWest_U 136 136 Last 129-144 + 10 HFD-MtnWest_U 175 175 Last 145-160 + 11 SCruz-NorCal_U 175 175 Last 161-175 + 12 SJ1-NorCal_U 190 190 Last 176-190 + 13 SJ2-NorCal_U 311 311 Last 191-204 + 14 SJ3-NorCal_U 311 311 Last 206-220 + 15 FMT-NorCal_U 311 311 Last 221-235 + 16 WLNTCRK-NorCal_U 311 311 Last 236-250 + 17 SBruno-NorCal_U 311 311 Last 251-265 + 18 Oakland-NorCal_U 311 311 Last 266-280 + 19 Lvrmore-NorCal_U 311 311 Last 281-295 + 20 Mt_Oso-NorCal_U 311 311 Last 296-310 + 21 Salinas-NorCal_U 311 311 Last 311-325 + 22 Pismo-NorCal_U 403 403 Last 326-340 + 23 SMaria-NorCal_U 403 403 Last 341-355 + 24 Rita-MtnWest_V 403 403 Last 356-371 + 25 Park-MtnWest_V 403 403 Last 372-387 + 26 Meadow-MtnWest_V 403 403 Last 388-403 + 27 Bullion-NorCal_V - - Last 404-418 + 28 Sonora-NorCal_V - - Last 419-433 + 29 Diablo-NorCal_V - - Last 434-448 + 30 Sac-NorCal_V - - Last 449-463 # Table of contacts. # 1) Contact number: 1-10000 # 2) Name: up to 16 characters, use '_' instead of space # 3) Call type: Group, Private, All # 4) Call ID: 1...16777215 -# 5) Call receive tone: -, Yes +# 5) Call receive tone: -, + # Contact Name Type ID RxTone 1 Local Group 2 - @@ -673,10 +673,11 @@ Contact Name Type ID RxTone # Table of group lists. # 1) Group list number: 1-250 -# 2) List of contacts: numbers and ranges (N-M) separated by comma +# 2) Name: up to 16 characters, use '_' instead of space +# 3) List of contacts: numbers and ranges (N-M) separated by comma # -Grouplist Contacts - 1 1 +Grouplist Name Contacts + 1 GroupList1 1 # Table of text messages. # 1) Message number: 1-50 diff --git a/examples/md2017-DualHotspot-PNW-2017-07-19.conf b/examples/md2017-DualHotspot-PNW-2017-07-19.conf index d364fd3..69aeafd 100644 --- a/examples/md2017-DualHotspot-PNW-2017-07-19.conf +++ b/examples/md2017-DualHotspot-PNW-2017-07-19.conf @@ -1,6 +1,6 @@ # # This configuration was generated 2018/08/30 by dmrconfig, -# Version 0.1.37, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# Version 0.1.40, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-UV380 Name: YourCall-Here @@ -1084,25 +1084,25 @@ Zone Name Channels 8b - 606,714,718,736,738,808,816,818,820,822,824,826,828,830,832,848 # Table of scan lists. -# 1) Zone number: 1-250 +# 1) Scan list number: 1-250 # 2) Name: up to 16 characters, use '_' instead of space # 3) Priority channel 1 (50% of scans): -, Sel or index # 4) Priority channel 2 (25% of scans): -, Sel or index -# 5) Designated transmit channel: -, Last or index +# 5) Designated transmit channel: Last, Sel or index # 6) List of channels: numbers and ranges (N-M) separated by comma # Scanlist Name PCh1 PCh2 TxCh Channels - 1 Public_Safety 992 992 Last 112-116 - 2 FavHamOnlyScan 992 992 Last 60-63 - 3 Capitol_Pk_Scan - - - 994-1000 - 4 BawFaw_Scan - - - 1003-1010 + 1 Public_Safety 992 992 Sel 112-116 + 2 FavHamOnlyScan 992 992 Sel 60-63 + 3 Capitol_Pk_Scan - - Last 994-1000 + 4 BawFaw_Scan - - Last 1003-1010 # Table of contacts. # 1) Contact number: 1-10000 # 2) Name: up to 16 characters, use '_' instead of space # 3) Call type: Group, Private, All # 4) Call ID: 1...16777215 -# 5) Call receive tone: -, Yes +# 5) Call receive tone: -, + # Contact Name Type ID RxTone 1 B1_Local Group 1 - @@ -1536,11 +1536,12 @@ Contact Name Type ID RxTone # Table of group lists. # 1) Group list number: 1-250 -# 2) List of contacts: numbers and ranges (N-M) separated by comma +# 2) Name: up to 16 characters, use '_' instead of space +# 3) List of contacts: numbers and ranges (N-M) separated by comma # -Grouplist Contacts - 1 4,75,292-293,327,411-412,419,423 - 2 5,11,265-269,271,280-281,283,329-330,420-422,427 +Grouplist Name Contacts + 1 Hotspot_Rx_List 4,75,292-293,327,411-412,419,423 + 2 PNW_All 5,11,265-269,271,280-281,283,329-330,420-422,427 # Table of text messages. # 1) Message number: 1-50 diff --git a/examples/md380-baynet-full-codeplug-rev1.conf b/examples/md380-baynet-full-codeplug-rev1.conf index 636538f..d3edfbc 100644 --- a/examples/md380-baynet-full-codeplug-rev1.conf +++ b/examples/md380-baynet-full-codeplug-rev1.conf @@ -1,6 +1,6 @@ # # This configuration was generated 2018/08/30 by dmrconfig, -# Version 0.1.37, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# Version 0.1.40, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-380 Name: YOURCALL @@ -69,60 +69,60 @@ Zone Name Channels 3 Hot_Spot 2,7 # Table of scan lists. -# 1) Zone number: 1-250 +# 1) Scan list number: 1-250 # 2) Name: up to 16 characters, use '_' instead of space # 3) Priority channel 1 (50% of scans): -, Sel or index # 4) Priority channel 2 (25% of scans): -, Sel or index -# 5) Designated transmit channel: -, Last or index +# 5) Designated transmit channel: Last, Sel or index # 6) List of channels: numbers and ranges (N-M) separated by comma # Scanlist Name PCh1 PCh2 TxCh Channels - 1 Daly_City Sel Sel - - - 2 Oakland Sel Sel - - - 3 Palo_Alto Sel Sel - - - 4 San_Jose_4 Sel Sel - - - 5 Moffett Sel Sel - - - 6 Auburn Sel Sel - - - 7 Bodega Sel Sel - - - 8 Dixon Sel Sel - - - 9 Fremont_1 Sel Sel - - - 10 Fremont_2 Sel Sel - - - 11 Gilroy Sel Sel - - - 12 Gualala Sel Sel - - - 13 Livermore Sel Sel - - - 14 Mariposa_MB Sel Sel - - - 15 Milpitas Sel Sel - - - 16 Modesto Sel Sel - - - 17 Mt._Oso Sel Sel - - - 18 New_Cuyama Sel Sel - - - 19 Novato Sel Sel - - - 20 Pittsburg Sel Sel - - - 21 Pleasanton Sel Sel - - - 22 Salinas Sel Sel - - - 23 San_Jose_1 Sel Sel - - - 24 San_Jose_2 Sel Sel - - - 25 San_Jose_3 Sel Sel - - - 26 San_Luis_Obispo Sel Sel - - - 27 Sanel_Mtn Sel Sel - - - 28 Santa_Cruz Sel Sel - - - 29 Santa_Maria Sel Sel - - - 30 Santa_Rosa Sel Sel - - - 31 Sebastopol Sel Sel - - - 32 Sonoma Sel Sel - - - 33 Sonoma_Mtn Sel Sel - 1 - 34 Sonora Sel Sel - - - 35 S._Lake_Tahoe Sel Sel - - - 36 Tuolumne Sel Sel - - - 37 Turlock Sel Sel - - - 38 Walnut_Creek Sel Sel - - - 39 Talk_Around Sel Sel - - + 1 Daly_City Sel Sel Last - + 2 Oakland Sel Sel Last - + 3 Palo_Alto Sel Sel Last - + 4 San_Jose_4 Sel Sel Last - + 5 Moffett Sel Sel Last - + 6 Auburn Sel Sel Last - + 7 Bodega Sel Sel Last - + 8 Dixon Sel Sel Last - + 9 Fremont_1 Sel Sel Last - + 10 Fremont_2 Sel Sel Last - + 11 Gilroy Sel Sel Last - + 12 Gualala Sel Sel Last - + 13 Livermore Sel Sel Last - + 14 Mariposa_MB Sel Sel Last - + 15 Milpitas Sel Sel Last - + 16 Modesto Sel Sel Last - + 17 Mt._Oso Sel Sel Last - + 18 New_Cuyama Sel Sel Last - + 19 Novato Sel Sel Last - + 20 Pittsburg Sel Sel Last - + 21 Pleasanton Sel Sel Last - + 22 Salinas Sel Sel Last - + 23 San_Jose_1 Sel Sel Last - + 24 San_Jose_2 Sel Sel Last - + 25 San_Jose_3 Sel Sel Last - + 26 San_Luis_Obispo Sel Sel Last - + 27 Sanel_Mtn Sel Sel Last - + 28 Santa_Cruz Sel Sel Last - + 29 Santa_Maria Sel Sel Last - + 30 Santa_Rosa Sel Sel Last - + 31 Sebastopol Sel Sel Last - + 32 Sonoma Sel Sel Last - + 33 Sonoma_Mtn Sel Sel Last 1 + 34 Sonora Sel Sel Last - + 35 S._Lake_Tahoe Sel Sel Last - + 36 Tuolumne Sel Sel Last - + 37 Turlock Sel Sel Last - + 38 Walnut_Creek Sel Sel Last - + 39 Talk_Around Sel Sel Last - # Table of contacts. # 1) Contact number: 1-1000 # 2) Name: up to 16 characters, use '_' instead of space # 3) Call type: Group, Private, All # 4) Call ID: 1...16777215 -# 5) Call receive tone: -, Yes +# 5) Call receive tone: -, + # Contact Name Type ID RxTone 1 Local Group 2 - @@ -144,10 +144,11 @@ Contact Name Type ID RxTone # Table of group lists. # 1) Group list number: 1-250 -# 2) List of contacts: numbers and ranges (N-M) separated by comma +# 2) Name: up to 16 characters, use '_' instead of space +# 3) List of contacts: numbers and ranges (N-M) separated by comma # -Grouplist Contacts - 1 1-2 +Grouplist Name Contacts + 1 Amateur_T2 1-2 # Table of text messages. # 1) Message number: 1-50 diff --git a/examples/md380-generic-norcal-uhf-20161103b.conf b/examples/md380-generic-norcal-uhf-20161103b.conf index ce341dc..8930a1d 100644 --- a/examples/md380-generic-norcal-uhf-20161103b.conf +++ b/examples/md380-generic-norcal-uhf-20161103b.conf @@ -1,6 +1,6 @@ # # This configuration was generated 2018/08/30 by dmrconfig, -# Version 0.1.37, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# Version 0.1.40, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-380 Name: noname @@ -1030,61 +1030,61 @@ Zone Name Channels 40 Turlock.rptr 909-922 # Table of scan lists. -# 1) Zone number: 1-250 +# 1) Scan list number: 1-250 # 2) Name: up to 16 characters, use '_' instead of space # 3) Priority channel 1 (50% of scans): -, Sel or index # 4) Priority channel 2 (25% of scans): -, Sel or index -# 5) Designated transmit channel: -, Last or index +# 5) Designated transmit channel: Last, Sel or index # 6) List of channels: numbers and ranges (N-M) separated by comma # Scanlist Name PCh1 PCh2 TxCh Channels - 1 PAARA_(SJ)_w6otx Sel - - 1-24 - 2 PaloAlto_k6otr Sel - - 25-48 - 3 DalyCity_n6amg Sel - - 49-72 - 4 MoffettFld_w6cmu Sel - - 73-96 - 5 SanJose_k6hle Sel - - 97-120 - 6 CrystalPk_k6hle Sel - - 121-144 - 7 LomaPrieta_w6yyy Sel - - 145-168 - 8 Gilroy_k6sia Sel - - 169-192 - 9 MtAllison_w6tcp Sel - - 193-216 - 10 Milpitas_wa6kpx Sel - - 217-240 - 11 Oakland_k6lnk Sel - - 241-264 - 12 SantaCruz_wa6ycz Sel - - 265-288 - 13 Salinas_w6jso Sel - - 289-312 - 14 Direct - - - 317-323 - 15 BlankDigital - - - 313-316 - 16 Pleasanton_n6ldj Sel - - 333-356 - 17 Livermore_k6lrg Sel - - 357-380 - 18 Pittsburg_k6pit Sel - - 381-404 - 19 WalnutCrk_k6lnk Sel - - 405-428 - 20 WalnutCrk2_n6mvt Sel - - 429-452 - 21 Novato_kg6mzv Sel - - 453-476 - 22 SanelMtn_nn6j Sel - - 477-500 - 23 SonomaCity_w6pe Sel - - 501-524 - 24 SonomaMtn_nn6j Sel - - 525-548 - 25 SantaRosa_k6acs Sel - - 549-572 - 26 Sebstopol_kc6sot Sel - - 573-596 - 27 BodegaBay_kj6qbm Sel - - 597-620 - 28 Gualala_k6lnk Sel - - 621-644 - 29 SLO_k6acr Sel - - 645-668 - 30 SantaMaria_k6acr Sel - - 669-692 - 31 NewCuyama_k7az Sel - - 693-716 - 32 Dixon_Sac._k6jwn Sel - - 717-740 - 33 Auburn_ng6d Sel - - 741-764 - 34 SoLkTahoe_wa6ewv Sel - - 765-788 - 35 Sonora_kj6nro Sel - - 789-812 - 36 Tuolumne_kj6nro Sel - - 813-836 - 37 MtBullion_k6acr Sel - - 837-860 - 38 MtOso_k6acr Sel - - 861-884 - 39 Modesto_k6acr Sel - - 885-908 - 40 Turlock_k6acr Sel - - 909-932 + 1 PAARA_(SJ)_w6otx Sel - Last 1-24 + 2 PaloAlto_k6otr Sel - Last 25-48 + 3 DalyCity_n6amg Sel - Last 49-72 + 4 MoffettFld_w6cmu Sel - Last 73-96 + 5 SanJose_k6hle Sel - Last 97-120 + 6 CrystalPk_k6hle Sel - Last 121-144 + 7 LomaPrieta_w6yyy Sel - Last 145-168 + 8 Gilroy_k6sia Sel - Last 169-192 + 9 MtAllison_w6tcp Sel - Last 193-216 + 10 Milpitas_wa6kpx Sel - Last 217-240 + 11 Oakland_k6lnk Sel - Last 241-264 + 12 SantaCruz_wa6ycz Sel - Last 265-288 + 13 Salinas_w6jso Sel - Last 289-312 + 14 Direct - - Last 317-323 + 15 BlankDigital - - Last 313-316 + 16 Pleasanton_n6ldj Sel - Last 333-356 + 17 Livermore_k6lrg Sel - Last 357-380 + 18 Pittsburg_k6pit Sel - Last 381-404 + 19 WalnutCrk_k6lnk Sel - Last 405-428 + 20 WalnutCrk2_n6mvt Sel - Last 429-452 + 21 Novato_kg6mzv Sel - Last 453-476 + 22 SanelMtn_nn6j Sel - Last 477-500 + 23 SonomaCity_w6pe Sel - Last 501-524 + 24 SonomaMtn_nn6j Sel - Last 525-548 + 25 SantaRosa_k6acs Sel - Last 549-572 + 26 Sebstopol_kc6sot Sel - Last 573-596 + 27 BodegaBay_kj6qbm Sel - Last 597-620 + 28 Gualala_k6lnk Sel - Last 621-644 + 29 SLO_k6acr Sel - Last 645-668 + 30 SantaMaria_k6acr Sel - Last 669-692 + 31 NewCuyama_k7az Sel - Last 693-716 + 32 Dixon_Sac._k6jwn Sel - Last 717-740 + 33 Auburn_ng6d Sel - Last 741-764 + 34 SoLkTahoe_wa6ewv Sel - Last 765-788 + 35 Sonora_kj6nro Sel - Last 789-812 + 36 Tuolumne_kj6nro Sel - Last 813-836 + 37 MtBullion_k6acr Sel - Last 837-860 + 38 MtOso_k6acr Sel - Last 861-884 + 39 Modesto_k6acr Sel - Last 885-908 + 40 Turlock_k6acr Sel - Last 909-932 # Table of contacts. # 1) Contact number: 1-1000 # 2) Name: up to 16 characters, use '_' instead of space # 3) Call type: Group, Private, All # 4) Call ID: 1...16777215 -# 5) Call receive tone: -, Yes +# 5) Call receive tone: -, + # Contact Name Type ID RxTone 1 Local Group 2 - @@ -1595,11 +1595,12 @@ Contact Name Type ID RxTone # Table of group lists. # 1) Group list number: 1-250 -# 2) List of contacts: numbers and ranges (N-M) separated by comma +# 2) Name: up to 16 characters, use '_' instead of space +# 3) List of contacts: numbers and ranges (N-M) separated by comma # -Grouplist Contacts - 1 5-11,16-26,28-33,35-37,49 - 2 1-4 +Grouplist Name Contacts + 1 TS1.BM.TalkGrps 5-11,16-26,28-33,35-37,49 + 2 TS2.BM.TlkGrps 1-4 # Table of text messages. # 1) Message number: 1-50 diff --git a/examples/md380-norcal-brandmeister.conf b/examples/md380-norcal-brandmeister.conf index 7582904..371a4c9 100644 --- a/examples/md380-norcal-brandmeister.conf +++ b/examples/md380-norcal-brandmeister.conf @@ -1,6 +1,6 @@ # # This configuration was generated 2018/08/30 by dmrconfig, -# Version 0.1.37, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# Version 0.1.40, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-380 Name: MYCALL @@ -318,60 +318,60 @@ Zone Name Channels 39 Walnut_Creek 70-74 # Table of scan lists. -# 1) Zone number: 1-250 +# 1) Scan list number: 1-250 # 2) Name: up to 16 characters, use '_' instead of space # 3) Priority channel 1 (50% of scans): -, Sel or index # 4) Priority channel 2 (25% of scans): -, Sel or index -# 5) Designated transmit channel: -, Last or index +# 5) Designated transmit channel: Last, Sel or index # 6) List of channels: numbers and ranges (N-M) separated by comma # Scanlist Name PCh1 PCh2 TxCh Channels - 1 Daly_City 140 140 - 134-147 - 2 Oakland 140 140 - 56-69 - 3 Palo_Alto 140 140 - 80-93 - 4 San_Jose_4 140 140 - 191-204 - 5 Moffett 140 140 - 172-185 - 6 Auburn 140 140 - 153-157 - 7 Bodega 140 140 - 129-133 - 8 Dixon 140 140 - 46-50 - 9 Fremont_1 140 140 - 215-219 - 10 Fremont_2 140 140 - 210-214 - 11 Gilroy 140 140 - 99-103 - 12 Gualala 140 140 - 51-55 - 13 Livermore 140 140 - 75-79 - 14 Mariposa_MB 140 140 - 1-5 - 15 Milpitas 140 140 - 230-234 - 16 Modesto 140 140 - 11-15 - 17 Mt._Oso 140 140 - 6-10 - 18 New_Cuyama 140 140 - 104-108 - 19 Novato 140 140 - 114-118 - 20 Pittsburg 140 140 - 94-98 - 21 Pleasanton 140 140 - 148-152 - 22 Salinas 140 140 - 186-190 - 23 San_Jose_1 140 140 - 220-224 - 24 San_Jose_2 140 140 - 36-40 - 25 San_Jose_3 140 140 - 41-45 - 26 San_Luis_Obispo 140 140 - 16-20 - 27 Sanel_Mtn 140 140 - 158-162 - 28 Santa_Cruz 140 140 - 235-239 - 29 Santa_Maria 140 140 - 21-25 - 30 Santa_Rosa 140 140 - 31-35 - 31 Sebastopol 140 140 - 109-113 - 32 Sonoma 140 140 - 205-209 - 33 Sonoma_Mtn 140 140 - 163-167 - 34 Sonora 140 140 - 119-123 - 35 S._Lake_Tahoe 140 140 - 225-229 - 36 Tuolumne 140 140 - 124-128 - 37 Turlock 140 140 - 26-30 - 38 Walnut_Creek 140 140 - 70-74 - 39 Talk_Around 227 227 - 168-171 + 1 Daly_City 140 140 Last 134-147 + 2 Oakland 140 140 Last 56-69 + 3 Palo_Alto 140 140 Last 80-93 + 4 San_Jose_4 140 140 Last 191-204 + 5 Moffett 140 140 Last 172-185 + 6 Auburn 140 140 Last 153-157 + 7 Bodega 140 140 Last 129-133 + 8 Dixon 140 140 Last 46-50 + 9 Fremont_1 140 140 Last 215-219 + 10 Fremont_2 140 140 Last 210-214 + 11 Gilroy 140 140 Last 99-103 + 12 Gualala 140 140 Last 51-55 + 13 Livermore 140 140 Last 75-79 + 14 Mariposa_MB 140 140 Last 1-5 + 15 Milpitas 140 140 Last 230-234 + 16 Modesto 140 140 Last 11-15 + 17 Mt._Oso 140 140 Last 6-10 + 18 New_Cuyama 140 140 Last 104-108 + 19 Novato 140 140 Last 114-118 + 20 Pittsburg 140 140 Last 94-98 + 21 Pleasanton 140 140 Last 148-152 + 22 Salinas 140 140 Last 186-190 + 23 San_Jose_1 140 140 Last 220-224 + 24 San_Jose_2 140 140 Last 36-40 + 25 San_Jose_3 140 140 Last 41-45 + 26 San_Luis_Obispo 140 140 Last 16-20 + 27 Sanel_Mtn 140 140 Last 158-162 + 28 Santa_Cruz 140 140 Last 235-239 + 29 Santa_Maria 140 140 Last 21-25 + 30 Santa_Rosa 140 140 Last 31-35 + 31 Sebastopol 140 140 Last 109-113 + 32 Sonoma 140 140 Last 205-209 + 33 Sonoma_Mtn 140 140 Last 163-167 + 34 Sonora 140 140 Last 119-123 + 35 S._Lake_Tahoe 140 140 Last 225-229 + 36 Tuolumne 140 140 Last 124-128 + 37 Turlock 140 140 Last 26-30 + 38 Walnut_Creek 140 140 Last 70-74 + 39 Talk_Around 227 227 Last 168-171 # Table of contacts. # 1) Contact number: 1-1000 # 2) Name: up to 16 characters, use '_' instead of space # 3) Call type: Group, Private, All # 4) Call ID: 1...16777215 -# 5) Call receive tone: -, Yes +# 5) Call receive tone: -, + # Contact Name Type ID RxTone 1 Local Group 2 - @@ -412,11 +412,12 @@ Contact Name Type ID RxTone # Table of group lists. # 1) Group list number: 1-250 -# 2) List of contacts: numbers and ranges (N-M) separated by comma +# 2) Name: up to 16 characters, use '_' instead of space +# 3) List of contacts: numbers and ranges (N-M) separated by comma # -Grouplist Contacts - 1 3-11,13-17,20-32,34 - 2 1-2,18-19,33 +Grouplist Name Contacts + 1 Amateur_T1 3-11,13-17,20-32,34 + 2 Amateur_T2 1-2,18-19,33 # Table of text messages. # 1) Message number: 1-50 diff --git a/md380.c b/md380.c index 825cf15..d582bf5 100644 --- a/md380.c +++ b/md380.c @@ -409,6 +409,8 @@ static int zone_append(int zone_index, int cnum) int i; for (i=0; i<16; i++) { + if (z->member[i] == cnum) + return 1; if (z->member[i] == 0) { z->member[i] = cnum; return 1; @@ -469,6 +471,8 @@ static int scanlist_append(int list_index, int cnum) int i; for (i=0; i<31; i++) { + if (sl->member[i] == cnum) + return 1; if (sl->member[i] == 0) { sl->member[i] = cnum; return 1; @@ -496,6 +500,33 @@ static void setup_contact(int index, const char *name, int type, int id, int rxt utf8_decode(ct->name, name, 16); } +static void setup_grouplist(int index, const char *name) +{ + grouplist_t *gl = (grouplist_t*) &radio_mem[OFFSET_GLISTS + index*96]; + + utf8_decode(gl->name, name, 16); +} + +// +// Add contact to a grouplist. +// Return 0 on failure. +// +static int grouplist_append(int index, int cnum) +{ + grouplist_t *gl = (grouplist_t*) &radio_mem[OFFSET_GLISTS + index*96]; + int i; + + for (i=0; i<32; i++) { + if (gl->member[i] == cnum) + return 1; + if (gl->member[i] == 0) { + gl->member[i] = cnum; + return 1; + } + } + return 0; +} + // // Check that the radio does support this frequency. // @@ -1121,10 +1152,11 @@ static void md380_print_config(radio_device_t *radio, FILE *out, int verbose) if (verbose) { fprintf(out, "# Table of group lists.\n"); fprintf(out, "# 1) Group list number: 1-%d\n", NGLISTS); - fprintf(out, "# 2) List of contacts: numbers and ranges (N-M) separated by comma\n"); + fprintf(out, "# 2) Name: up to 16 characters, use '_' instead of space\n"); + fprintf(out, "# 3) List of contacts: numbers and ranges (N-M) separated by comma\n"); fprintf(out, "#\n"); } - fprintf(out, "Grouplist Contacts\n"); + fprintf(out, "Grouplist Name Contacts\n"); for (i=0; iname, 16, 1); + fprintf(out, " "); if (gl->member[0]) { print_chanlist(out, gl->member, 32); } else { @@ -1859,8 +1893,74 @@ static int parse_contact(int first_row, char *line) // static int parse_grouplist(int first_row, char *line) { - //TODO: parse grouplist Contacts - return 0; + char num_str[256], name_str[256], list_str[256]; + int glnum; + + if (sscanf(line, "%s %s %s", num_str, name_str, list_str) != 3) + return 0; + + glnum = strtoul(num_str, 0, 10); + if (glnum < 1 || glnum > NGLISTS) { + fprintf(stderr, "Bad group list number.\n"); + return 0; + } + + if (first_row) { + // On first entry, erase the Grouplists table. + memset(&radio_mem[OFFSET_GLISTS], 0, NGLISTS*96); + } + + setup_grouplist(glnum-1, name_str); + + if (*list_str != '-') { + char *str = list_str; + int range = 0; + int last = 0; + + // Parse contact list. + for (;;) { + char *eptr; + int cnum = strtoul(str, &eptr, 10); + + if (eptr == str) { + fprintf(stderr, "Group list %d: wrong contact list '%s'.\n", glnum, str); + return 0; + } + if (cnum < 1 || cnum > NCONTACTS) { + fprintf(stderr, "Group list %d: wrong contact number %d.\n", glnum, cnum); + return 0; + } + + if (range) { + // Add range. + int c; + for (c=last+1; c<=cnum; c++) { + if (!grouplist_append(glnum-1, c)) { + fprintf(stderr, "Group list %d: too many contacts.\n", glnum); + return 0; + } + } + } else { + // Add single contact. + if (!grouplist_append(glnum-1, cnum)) { + fprintf(stderr, "Group list %d: too many contacts.\n", glnum); + return 0; + } + } + + if (*eptr == 0) + break; + + if (*eptr != ',' && *eptr != '-') { + fprintf(stderr, "Group list %d: wrong contact list '%s'.\n", glnum, eptr); + return 0; + } + range = (*eptr == '-'); + last = cnum; + str = eptr + 1; + } + } + return 1; } // diff --git a/uv380.c b/uv380.c index 0f8f675..beb9e64 100644 --- a/uv380.c +++ b/uv380.c @@ -427,6 +427,8 @@ static int zone_append(int zone_index, int b_flag, int cnum) if (b_flag) { for (i=0; i<64; i++) { + if (zext->member_b[i] == cnum) + return 1; if (zext->member_b[i] == 0) { zext->member_b[i] = cnum; return 1; @@ -434,12 +436,16 @@ static int zone_append(int zone_index, int b_flag, int cnum) } } else { for (i=0; i<16; i++) { + if (z->member_a[i] == cnum) + return 1; if (z->member_a[i] == 0) { z->member_a[i] = cnum; return 1; } } for (i=0; i<48; i++) { + if (zext->ext_a[i] == cnum) + return 1; if (zext->ext_a[i] == 0) { zext->ext_a[i] = cnum; return 1; @@ -503,6 +509,8 @@ static int scanlist_append(int list_index, int cnum) int i; for (i=0; i<31; i++) { + if (sl->member[i] == cnum) + return 1; if (sl->member[i] == 0) { sl->member[i] = cnum; return 1; @@ -530,6 +538,33 @@ static void setup_contact(int index, const char *name, int type, int id, int rxt utf8_decode(ct->name, name, 16); } +static void setup_grouplist(int index, const char *name) +{ + grouplist_t *gl = (grouplist_t*) &radio_mem[OFFSET_GLISTS + index*96]; + + utf8_decode(gl->name, name, 16); +} + +// +// Add contact to a grouplist. +// Return 0 on failure. +// +static int grouplist_append(int index, int cnum) +{ + grouplist_t *gl = (grouplist_t*) &radio_mem[OFFSET_GLISTS + index*96]; + int i; + + for (i=0; i<32; i++) { + if (gl->member[i] == cnum) + return 1; + if (gl->member[i] == 0) { + gl->member[i] = cnum; + return 1; + } + } + return 0; +} + // // Check that the radio does support this frequency. // @@ -1179,10 +1214,11 @@ static void uv380_print_config(radio_device_t *radio, FILE *out, int verbose) if (verbose) { fprintf(out, "# Table of group lists.\n"); fprintf(out, "# 1) Group list number: 1-%d\n", NGLISTS); - fprintf(out, "# 2) List of contacts: numbers and ranges (N-M) separated by comma\n"); + fprintf(out, "# 2) Name: up to 16 characters, use '_' instead of space\n"); + fprintf(out, "# 3) List of contacts: numbers and ranges (N-M) separated by comma\n"); fprintf(out, "#\n"); } - fprintf(out, "Grouplist Contacts\n"); + fprintf(out, "Grouplist Name Contacts\n"); for (i=0; iname, 16, 1); + fprintf(out, " "); if (gl->member[0]) { print_chanlist(out, gl->member, 32); } else { @@ -1932,8 +1970,74 @@ static int parse_contact(int first_row, char *line) // static int parse_grouplist(int first_row, char *line) { - //TODO: parse grouplist Contacts - return 0; + char num_str[256], name_str[256], list_str[256]; + int glnum; + + if (sscanf(line, "%s %s %s", num_str, name_str, list_str) != 3) + return 0; + + glnum = strtoul(num_str, 0, 10); + if (glnum < 1 || glnum > NGLISTS) { + fprintf(stderr, "Bad group list number.\n"); + return 0; + } + + if (first_row) { + // On first entry, erase the Grouplists table. + memset(&radio_mem[OFFSET_GLISTS], 0, NGLISTS*96); + } + + setup_grouplist(glnum-1, name_str); + + if (*list_str != '-') { + char *str = list_str; + int range = 0; + int last = 0; + + // Parse contact list. + for (;;) { + char *eptr; + int cnum = strtoul(str, &eptr, 10); + + if (eptr == str) { + fprintf(stderr, "Group list %d: wrong contact list '%s'.\n", glnum, str); + return 0; + } + if (cnum < 1 || cnum > NCONTACTS) { + fprintf(stderr, "Group list %d: wrong contact number %d.\n", glnum, cnum); + return 0; + } + + if (range) { + // Add range. + int c; + for (c=last+1; c<=cnum; c++) { + if (!grouplist_append(glnum-1, c)) { + fprintf(stderr, "Group list %d: too many contacts.\n", glnum); + return 0; + } + } + } else { + // Add single contact. + if (!grouplist_append(glnum-1, cnum)) { + fprintf(stderr, "Group list %d: too many contacts.\n", glnum); + return 0; + } + } + + if (*eptr == 0) + break; + + if (*eptr != ',' && *eptr != '-') { + fprintf(stderr, "Group list %d: wrong contact list '%s'.\n", glnum, eptr); + return 0; + } + range = (*eptr == '-'); + last = cnum; + str = eptr + 1; + } + } + return 1; } //